Welcome to Subscribe On Youtube
3572. Maximize Y‑Sum by Picking a Triplet of Distinct X‑Values
Description
You are given two integer arrays x
and y
, each of length n
. You must choose three distinct indices i
, j
, and k
such that:
x[i] != x[j]
x[j] != x[k]
x[k] != x[i]
Your goal is to maximize the value of y[i] + y[j] + y[k]
under these conditions. Return the maximum possible sum that can be obtained by choosing such a triplet of indices.
If no such triplet exists, return -1.
Example 1:
Input: x = [1,2,1,3,2], y = [5,3,4,6,2]
Output: 14
Explanation:
- Choose
i = 0
(x[i] = 1
,y[i] = 5
),j = 1
(x[j] = 2
,y[j] = 3
),k = 3
(x[k] = 3
,y[k] = 6
). - All three values chosen from
x
are distinct.5 + 3 + 6 = 14
is the maximum we can obtain. Hence, the output is 14.
Example 2:
Input: x = [1,2,1,2], y = [4,5,6,7]
Output: -1
Explanation:
- There are only two distinct values in
x
. Hence, the output is -1.
Constraints:
n == x.length == y.length
3 <= n <= 105
1 <= x[i], y[i] <= 106
Solutions
Solution 1: Sorting + Greedy + Hash Table
We pair the elements of arrays $x$ and $y$ into a 2D array $\textit{arr}$, and then sort $\textit{arr}$ in descending order by the value of $y$. Next, we use a hash table to record the $x$ values that have already been selected, and iterate through $\textit{arr}$, each time selecting an $x$ value and its corresponding $y$ value that has not been chosen yet, until we have selected three distinct $x$ values.
If we manage to select three different $x$ values during the iteration, we return the sum of their corresponding $y$ values; if we finish iterating without selecting three distinct $x$ values, we return -1.
The time complexity is $O(n \times \log n)$, and the space complexity is $O(n)$, where $n$ is the length of arrays $\textit{x}$ and $\textit{y}$.
-
class Solution { public int maxSumDistinctTriplet(int[] x, int[] y) { int n = x.length; int[][] arr = new int[n][0]; for (int i = 0; i < n; i++) { arr[i] = new int[] {x[i], y[i]}; } Arrays.sort(arr, (a, b) -> b[1] - a[1]); int ans = 0; Set<Integer> vis = new HashSet<>(); for (int i = 0; i < n; ++i) { int a = arr[i][0], b = arr[i][1]; if (vis.add(a)) { ans += b; if (vis.size() == 3) { return ans; } } } return -1; } }
-
class Solution { public: int maxSumDistinctTriplet(vector<int>& x, vector<int>& y) { int n = x.size(); vector<array<int, 2>> arr(n); for (int i = 0; i < n; ++i) { arr[i] = {x[i], y[i]}; } ranges::sort(arr, [](auto& a, auto& b) { return b[1] < a[1]; }); int ans = 0; unordered_set<int> vis; for (int i = 0; i < n; ++i) { int a = arr[i][0], b = arr[i][1]; if (vis.insert(a).second) { ans += b; if (vis.size() == 3) { return ans; } } } return -1; } };
-
class Solution: def maxSumDistinctTriplet(self, x: List[int], y: List[int]) -> int: arr = [(a, b) for a, b in zip(x, y)] arr.sort(key=lambda x: -x[1]) vis = set() ans = 0 for a, b in arr: if a in vis: continue vis.add(a) ans += b if len(vis) == 3: return ans return -1
-
func maxSumDistinctTriplet(x []int, y []int) int { n := len(x) arr := make([][2]int, n) for i := 0; i < n; i++ { arr[i] = [2]int{x[i], y[i]} } sort.Slice(arr, func(i, j int) bool { return arr[i][1] > arr[j][1] }) ans := 0 vis := make(map[int]bool) for i := 0; i < n; i++ { a, b := arr[i][0], arr[i][1] if !vis[a] { vis[a] = true ans += b if len(vis) == 3 { return ans } } } return -1 }
-
function maxSumDistinctTriplet(x: number[], y: number[]): number { const n = x.length; const arr: [number, number][] = []; for (let i = 0; i < n; i++) { arr.push([x[i], y[i]]); } arr.sort((a, b) => b[1] - a[1]); const vis = new Set<number>(); let ans = 0; for (let i = 0; i < n; i++) { const [a, b] = arr[i]; if (!vis.has(a)) { vis.add(a); ans += b; if (vis.size === 3) { return ans; } } } return -1; }
-
impl Solution { pub fn max_sum_distinct_triplet(x: Vec<i32>, y: Vec<i32>) -> i32 { let n = x.len(); let mut arr: Vec<(i32, i32)> = (0..n).map(|i| (x[i], y[i])).collect(); arr.sort_by(|a, b| b.1.cmp(&a.1)); let mut vis = std::collections::HashSet::new(); let mut ans = 0; for (a, b) in arr { if vis.insert(a) { ans += b; if vis.len() == 3 { return ans; } } } -1 } }