题目要求
给定一个整数数组 arr 和一个整数 k。求恰好删除 k 个元素后唯一整数的最少个数。
Example 1:
Input: arr = [5,5,4], k = 1 Output: 1 Explanation: Remove the single 4, only 5 is left.
Example 2:
Input: arr = [4,3,1,1,3,3,2], k = 3 Output: 2 Explanation: Remove 4, 2 and either one of the two 1s or three 3s. 1 and 3 will be left.
思路
用一个哈希表遍历一遍,我们就得到了arr中每个元素出现的次数,然后利用贪心的思维,从小到大把出现次数少的全部删掉,出现次数多的保留,统计留下的元素个数即可。
class Solution {
public:
int findLeastNumOfUniqueInts(vector<int>& arr, int k) {
unordered_map<int, int> map;
int n = arr.size();
vector<int> nums;
for (int i = 0; i < n; ++i) {
map[arr[i]]++;
}
for (auto pair : map) {
nums.push_back(pair.second);
}
sort(nums.begin(), nums.end());
// for (int i = 0; i < nums.size(); ++i) {
// cout << nums[i] << ' ';
// }
int sum = k, res = 0;
for (int j = 0; j < nums.size(); ++j) {
sum -= nums[j];
// cout << sum << endl;
if (sum < 0) {
res = nums.size() - j;
return res;
} else if (sum == 0) {
res = nums.size() - j - 1;
return res;
}
}
return 0;
}
};
时间复杂度
遍历操作O(n),排序O(nlogn),总体时间复杂度O(nlogn)。
空间复杂度
map、nums分别用来存储,复杂度O(n)。
欢迎大家批评指正, 我觉得存储成哈希表和后续的删减操作可以一起完成,欢迎大家留言讨论!