Easy
题目描述
给你一个整数数组 nums。
考虑数组中所有不同值 x 和 y 的数对,满足:
x < yx和y在nums中的频率不同
在所有这样的数对中:
- 选择
x值最小的数对 - 如果有多个数对的
x相同,选择y值最小的数对
返回一个整数数组 [x, y]。如果不存在有效数对,返回 [-1, -1]。
示例 1:
输入:nums = [1,1,2,2,3,4]
输出:[1,3]
解释:
最小值是 1,频率为 2。大于 1 且频率与 1 不同的最小值是 3,频率为 1。
因此答案是 [1, 3]。
示例 2:
输入:nums = [1,5]
输出:[-1,-1]
解释:
两个值的频率相同,所以不存在有效数对。返回 [-1, -1]。
示例 3:
输入:nums = [7]
输出:[-1,-1]
解释:
数组中只有一个值,所以不存在有效数对。返回 [-1, -1]。
提示:
1 <= nums.length <= 1001 <= nums[i] <= 100
解题思路
这道题需要找到满足条件的最小数对 [x, y],其中 x < y 且两者频率不同。
解题思路:
统计频率:首先使用哈希表统计每个数字的出现频率。
获取去重并排序的数组:将所有不同的数字提取出来并排序,这样可以按从小到大的顺序遍历。
双重循环查找:
- 外层循环遍历每个数字作为
x - 内层循环遍历大于
x的数字作为y - 检查它们的频率是否不同
- 外层循环遍历每个数字作为
返回结果:由于我们按照从小到大的顺序遍历,第一个找到的满足条件的数对就是答案。
算法复杂度:
- 时间复杂度:O(n²),其中 n 是不同数字的个数
- 空间复杂度:O(n),用于存储频率统计
这种方法简单直接,由于数据规模较小(最多100个元素),性能完全可以接受。
代码实现
class Solution {
public:
vector<int> minDistinctFreqPair(vector<int>& nums) {
unordered_map<int, int> freq;
for (int num : nums) {
freq[num]++;
}
vector<int> unique_nums;
for (auto& p : freq) {
unique_nums.push_back(p.first);
}
sort(unique_nums.begin(), unique_nums.end());
for (int i = 0; i < unique_nums.size(); i++) {
for (int j = i + 1; j < unique_nums.size(); j++) {
if (freq[unique_nums[i]] != freq[unique_nums[j]]) {
return {unique_nums[i], unique_nums[j]};
}
}
}
return {-1, -1};
}
};
class Solution:
def minDistinctFreqPair(self, nums: list[int]) -> list[int]:
from collections import Counter
freq = Counter(nums)
unique_nums = sorted(freq.keys())
for i in range(len(unique_nums)):
for j in range(i + 1, len(unique_nums)):
if freq[unique_nums[i]] != freq[unique_nums[j]]:
return [unique_nums[i], unique_nums[j]]
return [-1, -1]
public class Solution {
public int[] MinDistinctFreqPair(int[] nums) {
Dictionary<int, int> freq = new Dictionary<int, int>();
foreach (int num in nums) {
if (freq.ContainsKey(num)) {
freq[num]++;
} else {
freq[num] = 1;
}
}
List<int> uniqueNums = new List<int>(freq.Keys);
uniqueNums.Sort();
for (int i = 0; i < uniqueNums.Count; i++) {
for (int j = i + 1; j < uniqueNums.Count; j++) {
if (freq[uniqueNums[i]] != freq[uniqueNums[j]]) {
return new int[] {uniqueNums[i], uniqueNums[j]};
}
}
}
return new int[] {-1, -1};
}
}
var minDistinctFreqPair = function(nums) {
const freq = new Map();
for (const num of nums) {
freq.set(num, (freq.get(num) || 0) + 1);
}
const uniqueNums = Array.from(freq.keys()).sort((a, b) => a - b);
for (let i = 0; i < uniqueNums.length; i++) {
for (let j = i + 1; j < uniqueNums.length; j++) {
if (freq.get(uniqueNums[i]) !== freq.get(uniqueNums[j])) {
return [uniqueNums[i], uniqueNums[j]];
}
}
}
return [-1, -1];
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n²) | n 为不同数字的个数,需要双重循环查找数对 |
| 空间复杂度 | O(n) | 存储频率统计和去重数组 |