
2025-11-19:选择不同 X 值三元组使 Y 值之和最大。用go语言,给定两个长度相同的整数数组 x 和 y(长度为 n)。
从下标集合 {0,1,…,n-1} 中选出三个不同的位置 i、j、k,且这三处在 x 数组上的值两两不相同(即 x[i]、x[j]、x[k] 三者互异)。
要求使对应的 y 值之和 y[i] + y[j] + y[k] 尽可能大。
若不存在满足 x 值互异且下标互异的三元组,则返回 -1。
n == x.length == y.length。
3 <= n <= 100000。
1 <= x[i], y[i] <= 1000000。
输入:x = [1,2,1,3,2], y = [5,3,4,6,2]。
输出:14。
解释:
选择 i = 0(x[i] = 1,y[i] = 5),j = 1(x[j] = 2,y[j] = 3),k = 3(x[k] = 3,y[k] = 6)。
选出的三个 x 中的值互不相同。5 + 3 + 6 = 14 是我们能获得的最大值。因此输出为 14。
题目来自力扣3572。
这个方法通过映射高效地聚合了每个x值对应的最大y值,并通过排序快速定位最大的三个值,从而在保证正确性的同时实现了较高的效率。
.
package main
import (
"fmt"
"maps"
"slices"
)
func maxSumDistinctTriplet(x, y []int)int {
mx := map[int]int{}
for i, v := range x {
mx[v] = max(mx[v], y[i])
}
iflen(mx) < 3 {
return-1
}
a := slices.SortedFunc(maps.Values(mx), func(a, b int)int { return b - a })
return a[0] + a[1] + a[2]
}
func main() {
x := []int{1, 2, 1, 3, 2}
y := []int{5, 3, 4, 6, 2}
result := maxSumDistinctTriplet(x, y)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def maxSumDistinctTriplet(x, y):
mx = {}
for i, v in enumerate(x):
if v not in mx or y[i] > mx[v]:
mx[v] = y[i]
iflen(mx) < 3:
return-1
values = sorted(mx.values(), reverse=True)
return values[0] + values[1] + values[2]
def main():
x = [1, 2, 1, 3, 2]
y = [5, 3, 4, 6, 2]
result = maxSumDistinctTriplet(x, y)
print(result)
if __name__ == "__main__":
main()
.
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
int maxSumDistinctTriplet(const vector<int>& x, const vector<int>& y) {
unordered_map<int, int> mp;
// 构建 map: 对每个 x[i] 只保留对应最大的 y[i]
for (size_t i = 0; i < x.size(); i++) {
int key = x[i];
int val = y[i];
if (mp.count(key)) {
mp[key] = max(mp[key], val);
} else {
mp[key] = val;
}
}
if (mp.size() < 3) return-1;
// 提取所有 value
vector<int> vals;
vals.reserve(mp.size());
for (auto& p : mp) {
vals.push_back(p.second);
}
// 降序排序
sort(vals.begin(), vals.end(), greater<int>());
// 返回最大三个值的和
return vals[0] + vals[1] + vals[2];
}
int main() {
vector<int> x = {1, 2, 1, 3, 2};
vector<int> y = {5, 3, 4, 6, 2};
int result = maxSumDistinctTriplet(x, y);
cout << result << endl;
return0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。