跳至主要內容

按照频率将数组升序排列

冯泽立2024年12月24日大约 2 分钟教学文档遍历排序

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

2. 分析

  1. 这道题要求将给定的数组按照元素频率排序,因此需要获得每个元素的频率,然后排序。

    首先遍历数组获得每个元素的频率,然后定义二元组类型存储每个元素的元素值和频率,使用列表存储全部二元组,并对列表排序。列表排序的依据如下:

    如果两个二元组的频率不同,则根据频率升序排序;

    如果两个二元组的频率相同,则根据元素值降序排序。

    遍历排序后的列表,对于列表中的每个二元组,将元素值根据频率填入排序后的数组中。遍历结束之后即可得到完整的排序后的数组。

class Solution {
    class Pair {
        int num;
        int freq;

        public Pair(int num, int freq) {
            this.num = num;
            this.freq = freq;
        }
    }

    public int[] frequencySort(int[] nums) {
        Map<Integer, Integer> counts = new HashMap<Integer, Integer>();
        for (int num : nums) {
            counts.put(num, counts.getOrDefault(num, 0) + 1);
        }
        List<Pair> pairs = new ArrayList<Pair>();
        Set<Map.Entry<Integer, Integer>> entries = counts.entrySet();
        for (Map.Entry<Integer, Integer> entry : entries) {
            int num = entry.getKey();
            int freq = entry.getValue();
            pairs.add(new Pair(num, freq));
        }
        Collections.sort(pairs, (a, b) -> {
            if (a.freq != b.freq) {
                return a.freq - b.freq;
            } else {
                return b.num - a.num;
            }
        });
        int length = nums.length;
        int[] sorted = new int[length];
        int index = 0;
        for (Pair pair : pairs) {
            int num = pair.num;
            int freq = pair.freq;
            for (int i = 0; i < freq; i++) {
                sorted[index++] = num;
            }
        }
        return sorted;
    }
}

上次编辑于: 2025/1/13 09:18:24
贡献者: zilizhou,黄昱皓