Welcome to Subscribe On Youtube
3852. Smallest Pair With Different Frequencies
Description
You are given an integer array nums.
Consider all pairs of distinct values x and y from nums such that:
x < yxandyhave different frequencies innums.
Among all such pairs:
- Choose the pair with the smallest possible value of
x. - If multiple pairs have the same
x, choose the one with the smallest possible value ofy.
Return an integer array [x, y]. If no valid pair exists, return [-1, -1].
Example 1:
Input: nums = [1,1,2,2,3,4]
Output: [1,3]
Explanation:
The smallest value is 1 with a frequency of 2, and the smallest value greater than 1 that has a different frequency from 1 is 3 with a frequency of 1. Thus, the answer is [1, 3].
Example 2:
Input: nums = [1,5]
Output: [-1,-1]
Explanation:
Both values have the same frequency, so no valid pair exists. Return [-1, -1].
Example 3:
Input: nums = [7]
Output: [-1,-1]
Explanation:
There is only one value in the array, so no valid pair exists. Return [-1, -1].
Constraints:
1 <= nums.length <= 1001 <= nums[i] <= 100
Solutions
Solution 1: Hash Table
We use a hash table $\textit{cnt}$ to count the frequency of each value in the array. Then we find the smallest value $x$, and the smallest value $y$ that is greater than $x$ and has a different frequency from $x$. If no such $y$ exists, return $[-1, -1]$.
The time complexity is $O(n)$, and the space complexity is $O(n)$, where $n$ is the length of the array $\textit{nums}$.
-
class Solution { public int[] minDistinctFreqPair(int[] nums) { final int inf = Integer.MAX_VALUE; Map<Integer, Integer> cnt = new HashMap<>(); int x = inf; for (int v : nums) { cnt.merge(v, 1, Integer::sum); x = Math.min(x, v); } int minY = inf; for (int y : cnt.keySet()) { if (y < minY && cnt.get(x) != cnt.get(y)) { minY = y; } } return minY == inf ? new int[] {-1, -1} : new int[] {x, minY}; } } -
class Solution { public: vector<int> minDistinctFreqPair(vector<int>& nums) { const int inf = INT_MAX; unordered_map<int, int> cnt; int x = inf; for (int v : nums) { cnt[v]++; x = min(x, v); } int minY = inf; for (auto& [y, _] : cnt) { if (y < minY && cnt[x] != cnt[y]) { minY = y; } } if (minY == inf) { return {-1, -1}; } return {x, minY}; } }; -
class Solution: def minDistinctFreqPair(self, nums: list[int]) -> list[int]: cnt = Counter(nums) x = min(cnt.keys()) min_y = inf for y in cnt.keys(): if y < min_y and cnt[x] != cnt[y]: min_y = y return [-1, -1] if min_y == inf else [x, min_y] -
func minDistinctFreqPair(nums []int) []int { const inf = math.MaxInt cnt := make(map[int]int) for _, v := range nums { cnt[v]++ } x := slices.Min(nums) minY := inf for y := range cnt { if y < minY && cnt[x] != cnt[y] { minY = y } } if minY == inf { return []int{-1, -1} } return []int{x, minY} } -
function minDistinctFreqPair(nums: number[]): number[] { const inf = Number.MAX_SAFE_INTEGER; const cnt = new Map<number, number>(); let x = inf; for (const v of nums) { cnt.set(v, (cnt.get(v) ?? 0) + 1); x = Math.min(x, v); } let minY = inf; for (const [y] of cnt) { if (y < minY && cnt.get(x)! !== cnt.get(y)!) { minY = y; } } return minY === inf ? [-1, -1] : [x, minY]; }