1636. 按照频率将数组升序排序【模拟】

题目

给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。

请你返回排序后的数组。

难度:简单

提示:

  • 1 <= nums.length <= 100
  • -100 <= nums[i] <= 100

题解

按照题意,统计词频,再按词频排序即可。

注意在Java中是不支持对基本类型的数组自定义排序的,所以,这里我们需要要用Integer[] 数组。

class Solution {
    public int[] frequencySort(int[] nums) {
        Integer[] arr = new Integer[nums.length];
        int[] freqs = new int[201];
        for (int i = 0; i < nums.length; i++) {
            // 统计频次
            freqs[nums[i] + 100]++;
            //将int数组转换成Integer数组
            arr[i] = nums[i];
        }
        // Java中不支持对基本类型的数组自定义排序
        Arrays.sort(arr, (a, b) -> {
            // 按照频次排序
            return freqs[a + 100] == freqs[b + 100] ? b - a : freqs[a + 100] - freqs[b + 100];
            
            // 如果两个数的频次相同,那么这两个数就按照从大到小排序(后者减去前者)
            // 频次不相同,则按照频次排序
        });
        // 转换为int数组
        for (int i = 0; i < nums.length; i++) {
            nums[i] = arr[i];
        }
        return nums;
    }
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n+C)
posted @ 2022-09-19 09:27  tothk  阅读(36)  评论(0编辑  收藏  举报