国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

每日算法:前 K 個高頻元素

開發 前端 算法
桶排序 (Bucket sort)的工作的原理:假設輸入數據服從均勻分布,將數據分到有限數量的桶里,每個桶再分別排序(有可能再使用別的排序算法或是以遞歸方式繼續使用桶排序進行排)。

 

給定一個非空的整數數組,返回其中出現頻率前 k 高的元素。

示例 1:

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

示例 2:

  1. 輸入: nums = [1], k = 1 
  2. 輸出: [1] 

提示:

  • 你可以假設給定的 k 總是合理的,且 1 ≤ k ≤ 數組中不相同的元素的個數。
  • 你的算法的時間復雜度必須優于 O(nlogn) , n 是數組的大小。
  • 題目數據保證答案唯一,換句話說,數組中前 k 個高頻元素的集合是唯一的。
  • 你可以按任意順序返回答案。

解法一:map+數組

利用 map 記錄每個元素出現的頻率,利用數組來比較排序元素

代碼實現:

  1. let topKFrequent = function(nums, k) { 
  2.     let map = new Map(), arr = [...new Set(nums)] 
  3.     nums.map((num) => { 
  4.         if(map.has(num)) map.set(num, map.get(num)+1) 
  5.         else map.set(num, 1) 
  6.     }) 
  7.      
  8.     return arr.sort((a, b) => map.get(b) - map.get(a)).slice(0, k); 
  9. }; 

復雜度分析:

  • 時間復雜度:O(nlogn)
  • 空間復雜度:O(n)

題目要求算法的時間復雜度必須優于 O(n log n) ,所以這種實現不合題目要求

解法二:map + 小頂堆

遍歷一遍數組統計每個元素的頻率,并將元素值( key )與出現的頻率( value )保存到 map 中

通過 map 數據構建一個前 k 個高頻元素小頂堆,小頂堆上的任意節點值都必須小于等于其左右子節點值,即堆頂是最小值。

具體步驟如下:

  • 遍歷數據,統計每個元素的頻率,并將元素值( key )與出現的頻率( value )保存到 map 中
  • 遍歷 map ,將前 k 個數,構造一個小頂堆
  • 從 k 位開始,繼續遍歷 map ,每一個數據出現頻率都和小頂堆的堆頂元素出現頻率進行比較,如果小于堆頂元素,則不做任何處理,繼續遍歷下一元素;如果大于堆頂元素,則將這個元素替換掉堆頂元素,然后再堆化成一個小頂堆。
  • 遍歷完成后,堆中的數據就是前 k 大的數據

代碼實現:

  1. let topKFrequent = function(nums, k) { 
  2.     let map = new Map(), heap = [,] 
  3.     nums.map((num) => { 
  4.         if(map.has(num)) map.set(num, map.get(num)+1) 
  5.         else map.set(num, 1) 
  6.     }) 
  7.      
  8.     // 如果元素數量小于等于 k 
  9.     if(map.size <= k) { 
  10.         return [...map.keys()] 
  11.     } 
  12.      
  13.     // 如果元素數量大于 k,遍歷map,構建小頂堆 
  14.     let i = 0 
  15.     map.forEach((value, key) => { 
  16.         if(i < k) { 
  17.             // 取前k個建堆, 插入堆 
  18.             heap.push(key
  19.             // 原地建立前 k 堆 
  20.             if(i === k-1) buildHeap(heap, map, k) 
  21.         } else if(map.get(heap[1]) < value) { 
  22.             // 替換并堆化 
  23.             heap[1] = key 
  24.             // 自上而下式堆化第一個元素 
  25.             heapify(heap, map, k, 1) 
  26.         } 
  27.         i++ 
  28.     }) 
  29.     // 刪除heap中第一個元素 
  30.     heap.shift() 
  31.     return heap 
  32. }; 
  33.  
  34. // 原地建堆,從后往前,自上而下式建小頂堆 
  35. let buildHeap = (heap, map, k) => { 
  36.     if(k === 1) return 
  37.     // 從最后一個非葉子節點開始,自上而下式堆化 
  38.     for(let i = Math.floor(k/2); i>=1 ; i--) { 
  39.         heapify(heap, map, k, i) 
  40.     } 
  41.  
  42. // 堆化 
  43. let heapify = (heap, map, k, i) => { 
  44.     // 自上而下式堆化 
  45.     while(true) { 
  46.         let minIndex = i 
  47.         if(2*i <= k && map.get(heap[2*i]) < map.get(heap[i])) { 
  48.             minIndex = 2*i 
  49.         } 
  50.         if(2*i+1 <= k && map.get(heap[2*i+1]) < map.get(heap[minIndex])) { 
  51.             minIndex = 2*i+1 
  52.         } 
  53.         if(minIndex !== i) { 
  54.             swap(heap, i, minIndex) 
  55.             i = minIndex 
  56.         } else { 
  57.             break 
  58.         } 
  59.     } 
  60.  
  61. // 交換 
  62. let swap = (arr, i , j) => { 
  63.     let temp = arr[i] 
  64.     arr[i] = arr[j] 
  65.     arr[j] = temp 

復雜度分析:

  • 時間復雜度:遍歷數組需要 O(n) 的時間復雜度,一次堆化需要 O(logk) 時間復雜度,所以利用堆求 Top k 問題的時間復雜度為 O(nlogk)
  • 空間復雜度:O(n)

解法三:桶排序

這里取前k個高頻元素,使用計數排序不再適合,在上題目中使用計數排序,將 i 元素出現的次數存儲在 bucket[i] ,但這種存儲不能保證 bucket 數組上值是有序的,例如 bucket=[0,3,1,2] ,即元素 0 未出現,元素 1 出現 3 次,元素 2 出現 1 次,元素 3 出現 2 次,所以計數排序不適用于取前k個高頻元素,不過,不用怕,計數排序不行,還有桶排序。

桶排序是計數排序的升級版。它也是利用函數的映射關系。

桶排序 (Bucket sort)的工作的原理:假設輸入數據服從均勻分布,將數據分到有限數量的桶里,每個桶再分別排序(有可能再使用別的排序算法或是以遞歸方式繼續使用桶排序進行排)。

  • 首先使用 map 來存儲頻率
  • 然后創建一個數組(有數量的桶),將頻率作為數組下標,對于出現頻率不同的數字集合,存入對應的數組下標(桶內)即可。

代碼實現:

  1. let topKFrequent = function(nums, k) { 
  2.     let map = new Map(), arr = [...new Set(nums)] 
  3.     nums.map((num) => { 
  4.         if(map.has(num)) map.set(num, map.get(num)+1) 
  5.         else map.set(num, 1) 
  6.     }) 
  7.      
  8.     // 如果元素數量小于等于 k 
  9.     if(map.size <= k) { 
  10.         return [...map.keys()] 
  11.     } 
  12.      
  13.     return bucketSort(map, k) 
  14. }; 
  15.  
  16. // 桶排序 
  17. let bucketSort = (map, k) => { 
  18.     let arr = [], res = [] 
  19.     map.forEach((value, key) => { 
  20.         // 利用映射關系(出現頻率作為下標)將數據分配到各個桶中 
  21.         if(!arr[value]) { 
  22.             arr[value] = [key
  23.         } else { 
  24.             arr[value].push(key
  25.         } 
  26.     }) 
  27.     // 倒序遍歷獲取出現頻率最大的前k個數 
  28.     for(let i = arr.length - 1;i >= 0 && res.length < k;i--){ 
  29.         if(arr[i]) { 
  30.             res.push(...arr[i]) 
  31.         } 
  32.  } 
  33.  return res 

復雜度分析:

  • 時間復雜度:O(n)
  • 空間復雜度:O(n)

leetcode:https://leetcode-cn.com/problems/top-k-frequent-elements/solution/javascript-qian-k-ge-gao-pin-yuan-su-by-user7746o/ 

責任編輯:武曉燕 來源: 三分鐘學前端
相關推薦

2021-09-08 09:52:34

語言

2025-04-03 09:56:40

Python算法開發

2021-10-29 07:25:32

螺旋矩陣整數

2021-08-30 14:34:10

有效算法字符

2021-10-28 19:33:36

矩陣圖像內存

2021-11-19 07:54:40

前端

2021-11-12 09:44:03

字符串算法復雜度

2020-08-16 12:38:32

Python算法編程

2018-11-08 16:18:07

JavaScript前端

2021-09-30 09:58:14

路徑總和二叉樹

2021-09-03 09:41:36

字符串時間復雜度

2021-11-04 09:59:03

動態規劃策略

2021-12-07 06:55:17

節流函數Throttle

2021-09-29 10:19:00

算法平衡二叉樹

2021-10-27 10:43:36

數據流中位數偶數

2021-12-09 10:57:19

防抖函數 Debounce

2014-11-28 16:08:33

射頻識別RFID

2021-09-02 09:22:13

算法無重復字符

2021-09-10 08:31:54

翻轉字符串單詞

2024-05-27 00:05:00

點贊
收藏

51CTO技術棧公眾號

亚洲第一天堂无码专区| 7m第一福利500精品视频| 啦啦啦中文高清在线视频| 久久国产精品99久久人人澡| 国产日韩欧美电影在线观看| 婷婷激情久久| 性欧美xxxx| 在线精品自拍| 欧美人交a欧美精品| 成人午夜一级| 国产亚洲精品激情久久| 日韩欧美一区二区三区在线观看| 亚洲福利视频在线| 欧美午夜大胆人体| 日韩一区二区三区在线观看| 成人av免费| 欧美一级片免费看| 午夜伦理大片视频在线观看| 欧美一卡2卡3卡4卡| 怡红院在线播放| 欧美精品99久久久**| 国产黄色小视频在线| 欧美一区二区成人6969| 国产极品人妖在线观看| 亚洲国产精品va在线看黑人| 日本а中文在线天堂| 中文字幕日韩欧美在线| 韩国三级成人在线| 日本欧美爱爱爱| 91一区在线| 精品人伦一区二区三区| 久久精品99国产精品| 欧美一区二区三区视频免费播放 | 欧美色图一区二区三区| 91av资源在线| 精品国产亚洲在线| 向日葵视频成人app网址| 日韩色av导航| 加勒比久久高清| 91精品综合视频| 久久综合图片| 久久久精品在线视频| 一区二区欧美国产| 91精选在线| 久久99精品视频一区97| 手机亚洲手机国产手机日韩| 日韩免费三级| 国产欧美va欧美不卡在线| 中文字幕视频在线| 精品无码久久久久久国产| 成人高潮a毛片免费观看网站| 亚洲一区二区三| 国产黄色精品网站| 有色激情视频免费在线| 精品日韩欧美在线| 欧美专区一区| av一区观看| 成人福利电影精品一区二区在线观看| 丁香婷婷自拍| 日韩欧美自拍偷拍| 国产麻豆一区二区三区| 成人黄色生活片| 国产精品18久久久久久vr| 国语对白在线视频| 亚洲第一免费播放区| 日本中文字幕在线一区| 九九九九九九精品| 久久蜜桃一区二区| 91大神在线网站| 欧美激情久久久久久| 亚洲裸体俱乐部裸体舞表演av| 怡红院av亚洲一区二区三区h| 欧美丝袜美女中出在线| 国产精品99久久免费| 国产一区二区三区高清| 国产精品欧美一区二区三区| 色婷婷av在线| 国产97在线播放| 国产精品综合网| 黄视频在线观看免费| 久久riav二区三区| 98精品视频| 黄色a级在线观看| 亚洲男人的天堂网| 国产乱码午夜在线视频| 国产美女扒开尿口久久久| 国产一区二区三区在线看麻豆| 麻豆电影传媒二区| 亚洲欧美制服另类日韩| 亚洲国产精品91| 亚洲精品中文字幕无码蜜桃| 欧美一级淫片007| 国产极品模特精品一二| 日韩一二三区不卡在线视频| 亚洲人午夜精品天堂一二香蕉| h片在线观看下载| 亚洲自拍中文字幕| 久久久不卡网国产精品一区| 91p九色成人| 国模吧一区二区| 日韩精品三区四区| 最新精品视频在线| 美女av一区二区| 蜜臀av性久久久久蜜臀aⅴ流畅| 中文字幕在线观看第一页| 萌白酱国产一区二区| 美洲天堂一区二卡三卡四卡视频 | 国产精品一在线观看| www.av蜜桃| 精品国产一区二区三区av性色| 自拍日韩欧美| ga∨成人网| 欧美亚洲激情视频| 91蜜桃传媒精品久久久一区二区| 超碰在线99| 久久久91精品国产一区二区精品| 四虎影视国产在线视频| 国产美女在线精品免费观看| 亚洲一区二区三区四区的| 成功精品影院| 久久精品午夜福利| 日韩一区二区三区在线播放| 国产精品一色哟哟哟| 97成人资源| 制服国产精品| 亚洲精品成人网| 日本不卡免费在线视频| 污污的网站在线免费观看| 欧洲亚洲一区二区| 91精品国产综合久久香蕉的特点| 中文字幕一区二区三区乱码图片| 美乳中文字幕| 国产欧美日韩中文字幕在线| 夜夜爽夜夜爽精品视频| 日韩中文字幕91| 卡通动漫国产精品| 国产资源在线视频| 久久躁日日躁aaaaxxxx| 国产午夜一区二区三区| 亚洲一区网址| 成人免费视频网站在线看| 欧美亚洲午夜视频在线观看| 国产精品国产自产拍高清av| 日韩超碰人人爽人人做人人添| 国产青青视频| 成人免费看黄网站| 在线成人av影院| 久久精品国产精品青草| 欧美大胆成人| 波多野结衣乳巨码无在线| 日韩网站免费观看| 国产精品夫妻自拍| 欧美亚洲精品在线| 成人午夜影视| 久久天天东北熟女毛茸茸| 日韩一区二区欧美| 亚洲精品免费一二三区| 欧美激情视频一区二区三区在线播放| 阿v免费在线观看| 少妇熟女一区二区| 久久成人一区二区| 精品日韩视频在线观看| 日韩精彩视频在线观看| 91p九色成人| 麻豆福利视频| 国产一区二区三区高清| 亚洲欧美另类在线观看| 国产精品久久久久影视| 欧美日韩国产亚洲一区| 午夜久久中文| 交视频在线观看国产| 女人一区二区三区| 日韩在线免费高清视频| 一区二区三区高清| 国产农村妇女精品一区二区| 国产精品久久久久久av公交车| 国产精品腿扒开做爽爽爽挤奶网站| 97在线免费观看视频| 色八戒一区二区三区| 国产成人免费视频网站| 亚洲v天堂v手机在线| 老司机午夜在线| 免费av网址在线| 国产久一道中文一区| 中文字幕欧美日韩在线| 岛国精品视频在线播放| 国产黄色91视频| 91精品秘密在线观看| 欧美系列精品| 国产小视频在线| 国产成人无码a区在线观看视频| 成人a在线观看| www.日韩不卡电影av| 欧美性色黄大片| 久久精品亚洲乱码伦伦中文| 亚洲免费综合| 色狠狠久久av综合| sese综合| 快射av在线播放一区| 日本超碰在线观看|