|
| 1 | +# 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 |
| 2 | +# |
| 3 | +# |
| 4 | +# |
| 5 | +# 示例 1: |
| 6 | +# |
| 7 | +# |
| 8 | +# 输入: nums = [1,1,1,2,2,3], k = 2 |
| 9 | +# 输出: [1,2] |
| 10 | +# |
| 11 | +# |
| 12 | +# 示例 2: |
| 13 | +# |
| 14 | +# |
| 15 | +# 输入: nums = [1], k = 1 |
| 16 | +# 输出: [1] |
| 17 | +# |
| 18 | +# |
| 19 | +# |
| 20 | +# 提示: |
| 21 | +# |
| 22 | +# |
| 23 | +# 1 <= nums.length <= 105 |
| 24 | +# k 的取值范围是 [1, 数组中不相同的元素的个数] |
| 25 | +# 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的 |
| 26 | +# |
| 27 | +# |
| 28 | +# |
| 29 | +# |
| 30 | +# 进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。 |
| 31 | +# Related Topics 数组 哈希表 分治 桶排序 计数 快速选择 排序 堆(优先队列) |
| 32 | +# 👍 1275 👎 0 |
| 33 | + |
| 34 | + |
| 35 | +# leetcode submit region begin(Prohibit modification and deletion) |
| 36 | +class Solution: |
| 37 | + def topKFrequent(self, nums: List[int], k: int) -> List[int]: |
| 38 | + import collections |
| 39 | + counter = collections.Counter(nums) |
| 40 | + counter = list(counter.items()) |
| 41 | + |
| 42 | + def partition(nums, left, right): |
| 43 | + key= left |
| 44 | + while left<right: |
| 45 | + while left<right and nums[key][1]<=nums[right][1]: |
| 46 | + right-=1 |
| 47 | + while left<right and nums[key][1]>=nums[left][1]: |
| 48 | + left+=1 |
| 49 | + nums[left], nums[right] = nums[right], nums[left] |
| 50 | + nums[left], nums[key] =nums[key], nums[left] |
| 51 | + return left |
| 52 | + |
| 53 | + def sort(nums, k, left, right): |
| 54 | + if left>=right: |
| 55 | + return |
| 56 | + mid = partition(nums, left, right) |
| 57 | + if mid == k: |
| 58 | + return |
| 59 | + elif mid >k: |
| 60 | + sort(nums, k, left, mid - 1) |
| 61 | + else: |
| 62 | + sort(nums, k, mid+1, right) |
| 63 | + |
| 64 | + l = len(counter) |
| 65 | + sort(counter, l-k, 0, l-1) |
| 66 | + return [i[0] for i in counter[-k:]] |
| 67 | + |
| 68 | + |
| 69 | +# leetcode submit region end(Prohibit modification and deletion) |
0 commit comments