leetcode 1481. 不同整数的最少数目

法一:
class Solution {
public:
int findLeastNumOfUniqueInts(vector<int>& arr, int k) {
unordered_map<int,int> numAdded;
for(int &num : arr) ++numAdded[num];
vector<pair<int,int>> numAddedSort(numAdded.begin(),numAdded.end());
sort(numAddedSort.begin(),numAddedSort.end(),[&](auto x1,auto x2){
return x1.second < x2.second;
});
int res = numAdded.size(),size = res,left = 0,right;
while(k){
int goalValue = numAddedSort[left].second;
for(right = left;right < size && k > 0;++right){
if(numAddedSort[right].second == goalValue){
if(k >= goalValue){
k -= goalValue;
numAddedSort[right].second = 0;
--res;
}
else return res;
}
else break;
}
left = right;
}
return res;
}
};
法二:别人29ms的代码。不需要关注具体什么数字出现了多少次
class Solution {
public:
int findLeastNumOfUniqueInts(vector<int>& arr, int k) {
// 使用freq数组来存储arr中每个不同元素的出现频率
vector<int> freq;
// 先对原数组进行排序,以便后续统计相同元素的出现次数
sort(arr.begin(), arr.end());
int cnt, j; // cnt用于统计当前元素的出现次数,j用于遍历数组
// 遍历排序后的数组,统计每个元素的出现次数
for(int i = 0; i < arr.size();){
cnt = 1; // 初始化当前元素的出现次数为1
// 从i+1开始向后遍历,直到遇到不同的元素为止
for(j = i + 1; j < arr.size(); ++j)
if(arr[j] == arr[i]) ++cnt; // 如果元素相同,增加计数
else break; // 如果遇到不同元素,跳出内层循环
freq.emplace_back(cnt); // 将统计到的出现次数添加到freq数组中
i = j; // 更新外层循环的索引i,以避免重复遍历已统计过的元素
}
// 对freq数组进行排序,以便后续从频率最低的开始删除
sort(freq.begin(), freq.end());
int i;
// 从频率最低的元素开始尝试删除,直到k不足以删除下一个元素或所有元素都已尝试删除
for(i = 0; i < freq.size(); ++i)
if(k >= freq[i]) k -= freq[i]; // 如果k足够删除当前频率的元素,则减去该频率
else break; // 如果k不足以删除下一个元素,跳出循环
// 返回剩余的不同元素的数量,即freq数组的大小减去已尝试删除的元素数量
return freq.size() - i;
}
};
浙公网安备 33010602011771号