【无思路题目】1636. 按照频率将数组升序排序

  • 2020 年 11 月 6 日
  • 笔记

题目背景

我第一次尝试力扣双周赛,结果以这道题告败。第38场双周赛第一题,简单题,我却答不出。。。。

题目解法

【c++】我看了一下别人的方法,C++一般是先用cnt数组计算出频率,然用sort(nums.begin(),nums.end(),临时方法);

class Solution {
public:
    vector<int> frequencySort(vector<int>& nums) {
        unordered_map<int, int> cnt;
        for (auto n : nums) {
            cnt[n]++;
        }
        sort(nums.begin(), nums.end(), [&cnt](int a, int b) {
            return (cnt[a] == cnt[b]) ? a > b : cnt[a] < cnt[b];
        });
        return nums;
    }
};

此代码出处

【JAVA】然后发现了一个更好的方法,直接把-100 <= nums[i] <= 100用cnt数组提到了200,简直了,妙啊!

class Solution {
    public int[] frequencySort(int[] nums) {
        int[] cnts = new int[201];
        for (int n : nums){
            cnts[n + 100] ++;
        }
        for (int i = 0; i < nums.length; i ++){
            nums[i] = 10000 * cnts[nums[i] + 100] - nums[i] + 100;
        }
        Arrays.sort(nums);

        for (int i = 0; i < nums.length; i ++){
            nums[i] = 100 - nums[i] % 10000 ;
        }

        return nums;
    }
}

代码出处