3572: Max Y sum by picking triplet of distinct X values.
class Solution {
public:
struct Element{
int x_value;
int max_y;
};
struct ElementComparator{
bool operator()(Element& element1, Element& element2) {
if (element1.max_y == element2.max_y) {
return element1.x_value > element2.x_value;
}
return element1.max_y > element2.max_y;
}
};
int maxSumDistinctTriplet(vector<int>& x, vector<int>& y) {
std::unordered_map<int, int> x_to_max_y;
int n = x.size();
for(int index_i = 0; index_i < n; index_i++) {
if (!x_to_max_y.contains(x[index_i])) {
x_to_max_y[x[index_i]] = y[index_i];
continue;
}
// else update
x_to_max_y[x[index_i]] = std::max(
x_to_max_y[x[index_i]],
y[index_i]
);
}
// now place everything in a priority queue
if (x_to_max_y.size() < 3) {
return -1;
}
// othewise place everything in a vector and sort
std::vector<Element> list_of_elements;
for(auto [x_value, max_y] : x_to_max_y) {
list_of_elements.push_back(
Element{
.x_value = x_value,
.max_y = max_y
}
);
}
std::sort(
list_of_elements.begin(),
list_of_elements.end(),
ElementComparator()
);
return (
list_of_elements[0].max_y +
list_of_elements[1].max_y +
list_of_elements[2].max_y
);
}
};