道路的最大总重要性
难度:
标签:
题目描述
给你一个整数 n
,表示一个国家里的城市数目。城市编号为 0
到 n - 1
。
给你一个二维整数数组 roads
,其中 roads[i] = [ai, bi]
表示城市 ai
和 bi
之间有一条 双向 道路。
你需要给每个城市安排一个从 1
到 n
之间的整数值,且每个值只能被使用 一次 。道路的 重要性 定义为这条道路连接的两座城市数值 之和 。
请你返回在最优安排下,所有道路重要性 之和 最大 为多少。
示例 1:
输入:n = 5, roads = [[0,1],[1,2],[2,3],[0,2],[1,3],[2,4]] 输出:43 解释:上图展示了国家图和每个城市被安排的值 [2,4,5,3,1] 。 - 道路 (0,1) 重要性为 2 + 4 = 6 。 - 道路 (1,2) 重要性为 4 + 5 = 9 。 - 道路 (2,3) 重要性为 5 + 3 = 8 。 - 道路 (0,2) 重要性为 2 + 5 = 7 。 - 道路 (1,3) 重要性为 4 + 3 = 7 。 - 道路 (2,4) 重要性为 5 + 1 = 6 。 所有道路重要性之和为 6 + 9 + 8 + 7 + 7 + 6 = 43 。 可以证明,重要性之和不可能超过 43 。
示例 2:
输入:n = 5, roads = [[0,3],[2,4],[1,3]] 输出:20 解释:上图展示了国家图和每个城市被安排的值 [4,3,2,5,1] 。 - 道路 (0,3) 重要性为 4 + 5 = 9 。 - 道路 (2,4) 重要性为 2 + 1 = 3 。 - 道路 (1,3) 重要性为 3 + 5 = 8 。 所有道路重要性之和为 9 + 3 + 8 = 20 。 可以证明,重要性之和不可能超过 20 。
提示:
2 <= n <= 5 * 104
1 <= roads.length <= 5 * 104
roads[i].length == 2
0 <= ai, bi <= n - 1
ai != bi
- 没有重复道路。
代码结果
运行时间: 106 ms, 内存: 32.7 MB
/*
* 思路:
* 1. 使用 Java Stream API 统计每个城市的连接数。
* 2. 使用 Stream 对城市进行排序,并分配权重。
* 3. 计算每条道路的重要性之和。
*/
import java.util.Arrays;
import java.util.stream.IntStream;
public class Solution {
public int maximumImportance(int n, int[][] roads) {
// 统计每个城市的连接数
int[] degree = new int[n];
Arrays.stream(roads).forEach(road -> {
degree[road[0]]++;
degree[road[1]]++;
});
// 创建城市数组并排序
int[] cities = IntStream.range(0, n)
.boxed()
.sorted((a, b) -> Integer.compare(degree[b], degree[a]))
.mapToInt(i -> i)
.toArray();
// 分配权重并计算总重要性
int[] importance = new int[n];
IntStream.range(0, n).forEach(i -> importance[cities[i]] = n - i);
return Arrays.stream(roads)
.mapToInt(road -> importance[road[0]] + importance[road[1]])
.sum();
}
}
解释
方法:
本题的目标是为每个城市分配一个唯一的数值,以使得所有道路的重要性之和最大化。解题思路基于这样的观察:连接较多道路的城市应该被分配更大的数值,以最大化其贡献。首先,计算每个城市连接的道路数量,然后按这个数量对城市进行排序。城市的数值从小到大分配,即连接最少道路的城市分配最小的数值,连接最多道路的城市分配最大的数值。这样可以保证每条道路的两个城市的数值之和尽可能大。计算每个城市数值与其连接的道路数的乘积之和,得到最终的总重要性。
时间复杂度:
O(n log n)
空间复杂度:
O(n)
代码细节讲解
🦆
请问如何确保在为城市分配数值时,较高的数值被分配给连接道路数较多的城市?
▷🦆
排序后的城市是如何确保与原始城市的道路连接数对应正确的?即如何保持索引与城市ID的关系?
▷🦆
在极端情况下,如果所有城市的连接道路数量都相同,这种方法是否仍然有效?
▷🦆
这种方法是否考虑了道路的双向特性,即在计算每个城市连接的道路数时是否避免了重复计算?
▷