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;}
}
};

浙公网安备 33010602011771号