Skip to content

Latest commit

 

History

History
114 lines (85 loc) · 2.98 KB

File metadata and controls

114 lines (85 loc) · 2.98 KB

English Version

题目描述

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

 

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

 

提示:

  • 1 <= nums.length <= 105
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

 

进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

解法

“桶排序”实现。

Python3

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        counter = collections.Counter(nums)
        buckets = [[] for _ in range(len(nums) + 1)]
        for num, freq in counter.items():
            buckets[freq].append(num)
        i, res = len(nums), []
        while k > 0 and i >= 0:
            if buckets[i]:
                for num in buckets[i]:
                    if k <= 0:
                        break
                    res.append(num)
                    k -= 1
            i -= 1
        return res

Java

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> counter = new HashMap<>();
        for (int num : nums) {
            counter.put(num, counter.getOrDefault(num, 0) + 1);
        }
        List<Integer>[] buckets = new List[nums.length + 1];
        for (Map.Entry<Integer, Integer> entry : counter.entrySet()) {
            int num = entry.getKey();
            int freq = entry.getValue();
            if (buckets[freq] == null) {
                buckets[freq] = new ArrayList<>();
            }
            buckets[freq].add(num);
        }
        int[] res = new int[k];
        for (int i = nums.length; i >= 0 && k > 0; --i) {
            if (buckets[i] != null) {
                for (int num : buckets[i]) {
                    if (k <= 0) {
                        break;
                    }
                    res[--k] = num;
                }
            }
        }
        return res;
    }
}

...