我们需要把与 x 相邻的点中,分数最大且不同于 y 和 b 的点作为 a;把与 y 相邻的点中,分数最大且不同于 x 和 a 的点作为 b。
提示 3-3
与 x 相邻的点中,由于只需要与 y 和 b 不一样,我们仅需要保留分数最大的三个点,a 必定在这三个点中。
提示 3-4
剩下要做的,就是在枚举 edges 前,预处理出这三个点。
代码实现时,可以用排序(见 Go 和 Java)、堆(见 Python nlargest)、快速选择(见 C++ nth_element)或者手动维护求前三大。最优的时间复杂度为 O(n+m)。
[sol1-Python3]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution: defmaximumScore(self, scores: List[int], edges: List[List[int]]) -> int: g = [[] for _ inrange(len(scores))] for x, y in edges: g[x].append((scores[y], y)) g[y].append((scores[x], x)) for i, vs inenumerate(g): iflen(vs) > 3: g[i] = nlargest(3, vs)
# 下面这一段可以简写成一行,为了可读性这里就不写了 ans = -1 for x, y in edges: for score_a, a in g[x]: for score_b, b in g[y]: if y != a != b != x: ans = max(ans, score_a + scores[x] + scores[y] + score_b) return ans
classSolution { publicintmaximumScore(int[] scores, int[][] edges) { varn= scores.length; List<int[]>[] g = newArrayList[n]; Arrays.setAll(g, e -> newArrayList<>()); for (var e : edges) { intx= e[0], y = e[1]; g[x].add(newint[]{scores[y], y}); g[y].add(newint[]{scores[x], x}); } for (vari=0; i < n; i++) if (g[i].size() > 3) { g[i].sort((a, b) -> (b[0] - a[0])); g[i] = newArrayList<>(g[i].subList(0, 3)); }
varans= -1; for (var e : edges) { intx= e[0], y = e[1]; for (var p : g[x]) { vara= p[1]; for (var q : g[y]) { varb= q[1]; if (a != y && b != x && a != b) ans = Math.max(ans, p[0] + scores[x] + scores[y] + q[0]); } } } return ans; } }
classSolution { public: intmaximumScore(vector<int> &scores, vector<vector<int>> &edges){ int n = scores.size(); vector<vector<pair<int, int>>> g(n); for (auto &e : edges) { int x = e[0], y = e[1]; g[x].emplace_back(-scores[y], y); g[y].emplace_back(-scores[x], x); } for (auto &vs : g) if (vs.size() > 3) { nth_element(vs.begin(), vs.begin() + 3, vs.end()); vs.resize(3); }
int ans = -1; for (auto &e : edges) { int x = e[0], y = e[1]; for (auto &[score_a, a] : g[x]) for (auto &[score_b, b] : g[y]) if (a != y && b != x && a != b) ans = max(ans, -score_a + scores[x] + scores[y] - score_b); } return ans; } };
funcmaximumScore(scores []int, edges [][]int)int { type nb struct{ to, s int } g := make([][]nb, len(scores)) for _, e := range edges { x, y := e[0], e[1] g[x] = append(g[x], nb{y, scores[y]}) g[y] = append(g[y], nb{x, scores[x]}) } for i, vs := range g { iflen(vs) > 3 { sort.Slice(vs, func(i, j int)bool { return vs[i].s > vs[j].s }) g[i] = vs[:3] } }
ans := -1 for _, e := range edges { x, y := e[0], e[1] for _, p := range g[x] { for _, q := range g[y] { if p.to != y && q.to != x && p.to != q.to { ans = max(ans, p.s+scores[x]+scores[y]+q.s) } } } } return ans }
funcmax(a, b int)int { if b > a { return b }; return a }