class Solution {
public:
vector<long long> placedCoins(vector<vector<int>>& edges, vector<int>& cost) {
}
};
100141. 树中每个节点放置的金币数目
给你一棵 n
个节点的 无向 树,节点编号为 0
到 n - 1
,树的根节点在节点 0
处。同时给你一个长度为 n - 1
的二维整数数组 edges
,其中 edges[i] = [ai, bi]
表示树中节点 ai
和 bi
之间有一条边。
给你一个长度为 n
下标从 0 开始的整数数组 cost
,其中 cost[i]
是第 i
个节点的 开销 。
你需要在树中每个节点都放置金币,在节点 i
处的金币数目计算方法如下:
i
对应的子树中的节点数目小于 3
,那么放 1
个金币。i
对应的子树内 3
个不同节点的开销乘积的 最大值 ,并在节点 i
处放置对应数目的金币。如果最大乘积是 负数 ,那么放置 0
个金币。请你返回一个长度为 n
的数组 coin
,coin[i]
是节点 i
处的金币数目。
示例 1:
输入:edges = [[0,1],[0,2],[0,3],[0,4],[0,5]], cost = [1,2,3,4,5,6] 输出:[120,1,1,1,1,1] 解释:在节点 0 处放置 6 * 5 * 4 = 120 个金币。所有其他节点都是叶子节点,子树中只有 1 个节点,所以其他每个节点都放 1 个金币。
示例 2:
输入:edges = [[0,1],[0,2],[1,3],[1,4],[1,5],[2,6],[2,7],[2,8]], cost = [1,4,2,3,5,7,8,-4,2] 输出:[280,140,32,1,1,1,1,1,1] 解释:每个节点放置的金币数分别为: - 节点 0 处放置 8 * 7 * 5 = 280 个金币。 - 节点 1 处放置 7 * 5 * 4 = 140 个金币。 - 节点 2 处放置 8 * 2 * 2 = 32 个金币。 - 其他节点都是叶子节点,子树内节点数目为 1 ,所以其他每个节点都放 1 个金币。
示例 3:
输入:edges = [[0,1],[0,2]], cost = [1,2,-2] 输出:[0,1,1] 解释:节点 1 和 2 都是叶子节点,子树内节点数目为 1 ,各放置 1 个金币。节点 0 处唯一的开销乘积是 2 * 1 * -2 = -4 。所以在节点 0 处放置 0 个金币。
提示:
2 <= n <= 2 * 104
edges.length == n - 1
edges[i].length == 2
0 <= ai, bi < n
cost.length == n
1 <= |cost[i]| <= 104
edges
一定是一棵合法的树。原站题解
golang 解法, 执行用时: 256 ms, 内存消耗: 17.8 MB, 提交时间: 2023-12-25 00:38:37
func placedCoins(edges [][]int, cost []int) []int64 { n := len(cost) g := make([][]int, n) for _, e := range edges { x, y := e[0], e[1] g[x] = append(g[x], y) g[y] = append(g[y], x) } ans := make([]int64, n) var dfs func(int, int) []int dfs = func(x, fa int) []int { a := []int{cost[x]} for _, y := range g[x] { if y != fa { a = append(a, dfs(y, x)...) } } slices.Sort(a) m := len(a) if m < 3 { ans[x] = 1 } else { ans[x] = int64(max(a[m-3]*a[m-2]*a[m-1], a[0]*a[1]*a[m-1], 0)) } if m > 5 { a = append(a[:2], a[m-3:]...) } return a } dfs(0, -1) return ans }
java 解法, 执行用时: 74 ms, 内存消耗: 59.5 MB, 提交时间: 2023-12-25 00:38:23
class Solution { public long[] placedCoins(int[][] edges, int[] cost) { int n = cost.length; List<Integer>[] g = new ArrayList[n]; Arrays.setAll(g, e -> new ArrayList<>()); for (int[] e : edges) { int x = e[0], y = e[1]; g[x].add(y); g[y].add(x); } long[] ans = new long[n]; dfs(0, -1, cost, g, ans); return ans; } private List<Integer> dfs(int x, int fa, int[] cost, List<Integer>[] g, long[] ans) { List<Integer> a = new ArrayList<>(); a.add(cost[x]); for (int y : g[x]) { if (y != fa) { a.addAll(dfs(y, x, cost, g, ans)); } } Collections.sort(a); int m = a.size(); if (m < 3) { ans[x] = 1; } else { ans[x] = Math.max((long) a.get(m - 3) * a.get(m - 2) * a.get(m - 1), Math.max((long) a.get(0) * a.get(1) * a.get(m - 1), 0)); } if (m > 5) { a = List.of(a.get(0), a.get(1), a.get(m - 3), a.get(m - 2), a.get(m - 1)); } return a; } }
cpp 解法, 执行用时: 780 ms, 内存消耗: 238.4 MB, 提交时间: 2023-12-25 00:38:10
class Solution { public: vector<long long> placedCoins(vector<vector<int>> &edges, vector<int> &cost) { int n = cost.size(); vector<vector<int>> g(n); for (auto &e: edges) { int x = e[0], y = e[1]; g[x].push_back(y); g[y].push_back(x); } vector<long long> ans(n, 1); function<vector<int>(int, int)> dfs = [&](int x, int fa) -> vector<int> { vector<int> a = {cost[x]}; for (int y: g[x]) { if (y != fa) { auto res = dfs(y, x); a.insert(a.end(), res.begin(), res.end()); } } sort(a.begin(), a.end()); int m = a.size(); if (m >= 3) { ans[x] = max({(long long) a[m - 3] * a[m - 2] * a[m - 1], (long long) a[0] * a[1] * a[m - 1], 0LL}); } if (m > 5) { a = {a[0], a[1], a[m - 3], a[m - 2], a[m - 1]}; } return a; }; dfs(0, -1); return ans; } };
python3 解法, 执行用时: 432 ms, 内存消耗: 36.7 MB, 提交时间: 2023-12-25 00:37:56
class Solution: def placedCoins(self, edges: List[List[int]], cost: List[int]) -> List[int]: n = len(cost) g = [[] for _ in range(n)] for x, y in edges: g[x].append(y) g[y].append(x) ans = [1] * n def dfs(x: int, fa: int) -> List[int]: a = [cost[x]] for y in g[x]: if y != fa: a.extend(dfs(y, x)) a.sort() m = len(a) if m >= 3: ans[x] = max(a[-3] * a[-2] * a[-1], a[0] * a[1] * a[-1], 0) if m > 5: a = a[:2] + a[-3:] return a dfs(0, -1) return ans