1636 按照頻率將陣列升序排序

王培琳發表於2020-11-22

題目描述:
給你一個整數陣列 nums ,請你將陣列按照每個值的頻率 升序 排序。如果有多個值的頻率相同,請你按照數值本身將它們 降序 排序。
請你返回排序後的陣列。

示例 1:
輸入:nums = [1,1,2,2,2,3]
輸出:[3,1,1,2,2,2]
解釋:‘3’ 頻率為 1,‘1’ 頻率為 2,‘2’ 頻率為 3 。

示例 2:
輸入:nums = [2,3,1,3,2]
輸出:[1,3,3,2,2]
解釋:‘2’ 和 ‘3’ 頻率都為 2 ,所以它們之間按照數值本身降序排序。

示例 3:
輸入:nums = [-1,1,-6,4,5,-6,1,4,1]
輸出:[5,-1,4,4,-6,-6,1,1,1]

提示:
1 <= nums.length <= 100
-100 <= nums[i] <= 100

方法1:
主要思路:
(1)先將陣列中的元素進行統計,找出各個元素的頻率;
(2)在根據頻率和數字的大小,將統計的元素進行排序;
(3)使用排序後的陣列,生成需要的順序的陣列;

class Solution {
public:
    vector<int> frequencySort(vector<int>& nums) {
    	//統計各個元素的頻率
        unordered_map<int,int> mp;
        for(int& n:nums){
            ++mp[n];
        }
        //將頻率和陣列元素組成的陣列進行排序
        vector<pair<int,int>> sort_num(mp.begin(),mp.end());
        sort(sort_num.begin(),sort_num.end(),[](auto& lhs,auto& rhs){
            return lhs.second==rhs.second?lhs.first>rhs.first:lhs.second<rhs.second;
        });
        //根據排好序的陣列生成需要的陣列
        int pos=0;
        vector<int> res(nums.size(),0);
        for(auto&it:sort_num){
            for(int i=0;i<it.second;++i){
                res[pos++]=it.first;
            }
        }
        return res;
    }
};

方法2:
主要思路:
(1)也是先統計元素的頻率,只不過隨後直接使用統計的資訊對陣列進行排序;
(2)程式碼更加簡潔,但是時間明顯慢了很多,可能是排序的陣列的長度變長了很多的原因;

class Solution {
public:
    vector<int> frequencySort(vector<int>& nums) {
        unordered_map<int,int> mp;
        for(int& n:nums){
            ++mp[n];
        }

        vector<int> res=nums;
        //直接根據統計的資訊進行排序
        sort(res.begin(),res.end(),[&mp](int lhs,int rhs){
            return mp[lhs]==mp[rhs]?lhs>rhs:mp[lhs]<mp[rhs];
        });
  
        return res;
    }
};

相關文章