1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public long minimumFuelCost(int[][] roads, int seats) {
Map<Integer, List<Integer>> nodeNeighbors = new HashMap<>();
for (int[] road : roads) {
nodeNeighbors.computeIfAbsent(road[0], (key) -> new ArrayList<>()).add(road[1]);
nodeNeighbors.computeIfAbsent(road[1], (key) -> new ArrayList<>()).add(road[0]);
}
return minimumLiters(0, -1, nodeNeighbors, seats)[0];
}

// result[0] minimum liters, result[1] number of people at this city
private long[] minimumLiters(int node, int parent, Map<Integer, List<Integer>> nodeNeighbors, int seats) {
if (!nodeNeighbors.containsKey(node)) {
return new long[] { 0, 1 };
}
long literCount = 0, peopleCount = 1;
for (int neighbor : nodeNeighbors.get(node)) {
if (neighbor == parent)
continue;
long[] neighborInfo = minimumLiters(neighbor, node, nodeNeighbors, seats);
long carNeeded = neighborInfo[1] % seats == 0 ? neighborInfo[1] / seats : neighborInfo[1] / seats + 1;
literCount += neighborInfo[0] + carNeeded;
peopleCount += neighborInfo[1];
}
return new long[] { literCount, peopleCount };
}
}

递归函数干的事情就是在某个node, 它能告诉我们以它为root的tree中所有的node(不包含它的parent)到它这里的liter以及人的个数是多少. 这样我们可以对我们的child分别调用, 然后把child得到的结果汇总起来即可.

时间复杂度: O(n)
空间复杂度: O(n)