剑指OfferII060.出现频率最高的k个数字

题目

给定一个整数数组 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 是数组大小。

注意:本题与主站 347 题相同

解题思路分析

1、哈希辅助;时间复杂度O(nlog(n)),空间复杂度O(n)

func topKFrequent(nums []int, k int) []int {
   m := make(map[int]int)
   for i := 0; i < len(nums); i++ {
      m[nums[i]]++
   }
   arr := make([][2]int, 0)
   for k, v := range m {
      arr = append(arr, [2]int{k, v})
   }
   sort.Slice(arr, func(i, j int) bool {
      return arr[i][1] > arr[j][1]
   })
   res := make([]int, 0)
   for i := 0; i < k; i++ {
      res = append(res, arr[i][0])
   }
   return res
}

2、堆;时间复杂度O(nlog(n)),空间复杂度O(n)

func topKFrequent(nums []int, k int) []int {
   m := make(map[int]int)
   for i := 0; i < len(nums); i++ {
      m[nums[i]]++
   }
   var h IntHeap
   heap.Init(&h)
   for k, v := range m {
      heap.Push(&h, [2]int{k, v})
   }
   res := make([]int, 0)
   for h.Len() > 0 && k > 0 {
      k--
      node := heap.Pop(&h).([2]int)
      res = append(res, node[0])
   }
   return res
}

type IntHeap [][2]int

func (h IntHeap) Len() int            { return len(h) }
func (h IntHeap) Less(i, j int) bool  { return h[i][1] > h[j][1] }
func (h IntHeap) Swap(i, j int)       { h[i], h[j] = h[j], h[i] }
func (h *IntHeap) Push(x interface{}) { *h = append(*h, x.([2]int)) }
func (h *IntHeap) Pop() interface{} {
   old := *h
   n := len(old)
   x := old[n-1]
   *h = old[0 : n-1]
   return x
}

3、桶排序;时间复杂度O(n),空间复杂度O(n)

剑指OfferII060.出现频率最高的k个数字

func topKFrequent(nums []int, k int) []int {
   m := make(map[int]int)
   for i := 0; i < len(nums); i++ {
      m[nums[i]]++
   }
   arr := make([][]int, len(nums)+1)
   temp := make(map[int][]int)
   for key, value := range m {
      temp[value] = append(temp[value], key)
      arr[value] = append(arr[value], key)
   }
   res := make([]int, 0)
   for i := len(arr) - 1; i >= 0; i-- {
      // 避免出现0=>x次的情况
      if _, ok := temp[i]; ok {
         for j := 0; j < len(arr[i]); j++ {
            k--
            if k < 0 {
               break
            }
            res = append(res, arr[i][j])
         }
      }
   }
   return res
}

总结

Medium题目,题目同leetcode 347.前K个高频元素

展开阅读全文

页面更新:2024-03-12

标签:复杂度   整数   数组   示例   顺序   频率   题目   元素   提示   答案   情况   数字   时间   科技   空间

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top