3572. 选择不同 X 值三元组使 Y 值之和最大

问题

给你两个整数数组 x 和 y,长度均为 n。你必须选择三个 不同 的下标 i ,j 和 k,满足以下条件:

x[i] != x[j]
x[j] != x[k]
x[k] != x[i]
你的目标是在满足这些条件下 最大化 y[i] + y[j] + y[k] 的值。返回通过选择这样一组三元组下标所能获得的 最大 可能和。

如果不存在这样的三元组,返回 -1。

示例 1:
输入: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。

示例 2:
输入:x = [1,2,1,2], y = [4,5,6,7]
输出:-1
解释:
x 中只有两个不同的值。因此输出为 -1。

分析

记录y中元素和索引,根据元素排序,选择最大的3个且对应索引在x中的值不重复即可。难点在于数据结构的选择,由于y中元素可能重复,所以不能用map,用vector<pair<int, int>>即可。

代码

class Solution {
public:
    static bool cmp(pair<int, int> e1, pair<int, int> e2) {
        return e1.first > e2.first;
    }
    vector<pair<int, int> > yx;
    int maxSumDistinctTriplet(vector<int>& x, vector<int>& y) {
        for (int i = 0; i < y.size(); i++) {
            yx.push_back(make_pair(y[i], x[i]));
        }
        sort(yx.begin(), yx.end(), cmp);
        unordered_set<int> us;
        int num = 0;
        int s = 0;
        for (int i = 0; i < y.size() && num < 3; i++) {
            if (us.find(yx[i].second) != us.end()) {continue;}
            us.insert(yx[i].second);
            num++;
            s += yx[i].first;
        }
        if (num == 3) {return s;}
        else {return -1;}
        
    }
};
posted @ 2025-06-08 12:34  saulstavo  阅读(43)  评论(0)    收藏  举报