演算法基礎 堆相關 陣列中前K個高頻元素

2021-10-09 11:47:49 字數 1367 閱讀 8834

給定乙個非空的整數陣列,返回其**現頻率前 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 注意比較兩個單詞詞頻的時候,如果詞頻相等,還...