給定乙個非空的整數陣列,返回其**現頻率前 k 高的元素。
示例 1:
輸入: nums = [1,1,1,2,2,3], k = 2
輸出: [1,2]
示例 2:
輸入: nums = [1], k = 1
輸出: [1]
本題和上一題基本類似,都可以使用小頂堆處理,只是上一題第一步是對大小進行排序,構建小頂堆的時候可以借助堆的特性直接得出結果,而本題需要對出現頻率進行排序。排序方式很簡單,只需要在遍歷陣列的時候記錄頻率即可。
我們可以使用map
在遍歷的過程中記錄元素值和出現的頻率。然後遍歷map
取前k
個數作構建小頂堆。剩下的步驟就跟上題一致了,從k
位開始繼續遍歷,比較該元素與堆頂元素出現的頻率,如果出現的頻率高,就直接替換掉堆頂元素,進行堆化,否則不做處理。
/**
* @param nums
* @param k
* @return
*/var
topkfrequent
=function
(nums, k)
else})
// 如果元素數量小於k
if(map.size <= k)
// 如果元素數量大於k 則遍歷map
var i =0;
// 記錄插入個數
map.
foreach
(function
(value,key)
// 如果k個元素之後的元素出現次數大於堆頂 則替換
}else
if(map.
get(heap[1]
)< value)
i++})
// 刪除 堆中第乙個佔位
heap.
shift()
return heap};
// 原地建堆
varbuildheap
=function
(heap,map,k)
}//堆化
varheapify
=function
(heap,map,k,i)if(
2*i+
1<= k && map.
get(heap[
2*i+1]
)< map.
get(heap[minindex]))
if(minindex !== i)
else}}
// 交換
letswap
=(arr, i , j)
=>
堆相關 347 前 K 個高頻元素
給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 在這裡,我們可以利用堆的思想 建立乙個小頂堆,然後遍歷 出現次數陣列 如果堆的元素個數小於 kk,就可以直接插入堆中。如果堆...
演算法 前 K 個高頻元素
題目 給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。例如輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 題解 思路還是比較清晰的 1,先初始化乙個map,通過遍歷,將每個元素的次數統計出來 2,取次數中的前k個元素。關鍵是第二步怎麼取。如果通過排序來取的話,時間複雜度肯定是相...
演算法 leetcode 前K個高頻單詞
給一非空的單詞列表,返回前 k 個出現次數最多的單詞。返回的答案應該按單詞出現頻率由高到低排序。如果不同的單詞有相同出現頻率,按字母順序排序。使用map統計詞頻,並構建兩個list以相同順序分別存放詞頻和對應字串 構建最小堆,根據詞頻同步調整兩個list 注意比較兩個單詞詞頻的時候,如果詞頻相等,還...