classSolution: def findChampion(self, n: int, edges: List[List[int]]) -> int: degree = [0] * n for x, y in edges: degree[y] += 1 arr = [i for i, x in enumerate(degree) if x == 0] iflen(arr) == 1: return arr[0] return-1
100118. 在树上执行操作以后得到的最大分数
有一棵 n 个节点的无向树,节点编号为 0 到 n - 1 ,根节点编号为 0 。给你一个长度为 n - 1 的二维整数数组 edges 表示这棵树,其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 有一条边。
同时给你一个长度为 n 下标从 0 开始的整数数组 values ,其中 values[i] 表示第 i 个节点的值。
classSolution: defmaximumScoreAfterOperations(self, edges: List[List[int]], values: List[int]) -> int: n = len(values) graph = [[] for _ inrange(n)] for x, y in edges: graph[x].append(y) graph[y].append(x) tot = [0] * n
defdfs1(root, parent): res = values[root] for v in graph[root]: if v == parent: continue res += dfs1(v, root) tot[root] = res return res
defdfs2(root, parent): if root != 0andlen(graph[root]) == 1: return0 res1, res2 = 0, values[root] for v in graph[root]: if v == parent: continue res1 += tot[v] res2 += dfs2(v, root) returnmax(res1, res2)
dfs1(0, -1) return dfs2(0, -1)
100112. 平衡子序列的最大和
给你一个下标从 0 开始的整数数组 nums 。
nums 一个长度为 k 的 子序列 指的是选出 k 个 下标i0 < i1 < ... < ik-1 ,如果这个子序列满足以下条件,我们说它是 平衡的 :
对于范围 [1, k - 1] 内的所有 j ,nums[ij] - nums[ij-1] >= ij - ij-1 都成立。
voidupdateTree(int x, longlong val, int idx){ if (x < tree[idx].l || x > tree[idx].r) { return; } if (x == tree[idx].l && x == tree[idx].r) { tree[idx].maxVal = val; return; } int mid = (tree[idx].l + tree[idx].r) / 2; if (x <= mid) { updateTree(x, val, CHL(idx)); } else { updateTree(x, val, CHR(idx)); } pushUpTree(idx); }
longlongqueryTree(int l, int r, int idx){ if (r < tree[idx].l || l > tree[idx].r) { return0; } if (l <= tree[idx].l && r >= tree[idx].r) { return tree[idx].maxVal; } int mid = (tree[idx].l + tree[idx].r) / 2; if (r <= mid) { returnqueryTree(l, r, CHL(idx)); } elseif (l > mid) { returnqueryTree(l, r, CHR(idx)); } else { returnmax(queryTree(l, mid, CHL(idx)), queryTree(mid + 1, r, CHR(idx))); } }
classSolution { public: longlongmaxBalancedSubsequenceSum(vector<int>& nums){ unordered_set<int> cnt; for (int i = 0; i < nums.size(); i++) { cnt.emplace(nums[i] - i); } vector<int> arr(cnt.begin(), cnt.end()); sort(arr.begin(), arr.end()); int n = arr.size(); buildTree(1, 0, n - 1);
longlong res = *max_element(nums.begin(), nums.end()); for (int i = 0; i < nums.size(); i++) { auto it = upper_bound(arr.begin(), arr.end(), nums[i] - i); int x = it - arr.begin(); if (nums[i] > 0) { longlong val = queryTree(0, x - 1, 1) + nums[i]; updateTree(x - 1, val, 1); res = max(res, val); } } return res; } };