【LeetCode】按照频率将数组升序排序Java题解

147 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情

题目描述

给你一个整数数组 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]
 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-array-by-increasing-frequency
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目是数组排序题目,这个题目的要求先按照频率升序排序,如果频率相同,按照数值降序排序。
  • 根据题目要求,我们先使用 hashmap 统计出每个字符出现的频率。然后构造一个当前数值,频率对的二维数组。对二维数组,先按照频率升序排序,如果频率相同,按照数值降序排序。
  • 题目思路没有什么难度,考察的是代码编程的基本功底,熟练使用 API的能力,实现代码如下,供参考。

通过代码

class Solution {
    public int[] frequencySort(int[] nums) {
        int n = nums.length;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
        }

        int[][] temp = new int[n][2];
        for (int i = 0; i < n; i++) {
            temp[i] = new int[]{nums[i], map.get(nums[i])};
        }

        Arrays.sort(temp, new Comparator<int[]>(){
            @Override
            public int compare(int[] a, int[] b) {
                if (a[1] == b[1]) {
                    return b[0] - a[0];
                } else {
                    return a[1] - b[1];
                }
            }
        });

        int[] ans = new int[n];
        for (int i = 0; i < n; i++) {
            ans[i] = temp[i][0];
        }

        return ans;
    }
}

总结

  • 上述算法的时间复杂度是O(n * log n ), 空间复杂度是O(n)
  • 坚持算法每日一题,加油!