uacs2024

导航

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

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;
    }
};

 

posted on 2024-12-16 14:49  ᶜʸᵃⁿ  阅读(22)  评论(0)    收藏  举报