演算法 leetcode 前K個高頻單詞

2021-10-03 07:41:54 字數 1859 閱讀 5805

給一非空的單詞列表,返回前 k 個出現次數最多的單詞。

返回的答案應該按單詞出現頻率由高到低排序。如果不同的單詞有相同出現頻率,按字母順序排序。

使用map統計詞頻,並構建兩個list以相同順序分別存放詞頻和對應字串;

構建最小堆,根據詞頻同步調整兩個list;

注意比較兩個單詞詞頻的時候,如果詞頻相等,還需要根據單詞字母順序比較。

採用堆排序,隨後輸出已排序堆即可

class

solution

else

}// 儲存詞頻

list

countnums =

newarraylist

(countmap.

entryset()

.size()

);// 儲存去重後單詞,順序和原始詞頻陣列一致

list

words2 =

newarraylist

(countmap.

entryset()

.size()

);// 遍歷統計詞頻map,填充詞頻和單詞陣列

iterator

> iterator = countmap.

entryset()

.iterator()

;while

(iterator.

hasnext()

)// 構建大小為k的最小堆,並調整前k個直接放入的元素

int h =

(k-1)/

2;for(

int l = h; l >=

0; l--

)// 從k+1個元素開始一次和堆頂比較

// 如果比堆頂元素還大,就交換並開始從堆頂調整堆

for(

int l = k;lsize()

;l++)}

// 將堆頂最小元素放到堆末尾,並排除堆尾部已排序元素,再從堆頂開始做堆排序

for(

int l = k-

1;l>=

0;l--

)return words2.

sublist(0

,k);

}public

boolean

leftgreater

(string left,string right)

else

if(l > r)

}return left.

length()

< right.

length()

;}//從指定start位置往下調整

public

void

adjustminheap

(list

nums,

int start,

int length, list

words2)

else

if(nums.

get(j)

== nums.

get(j+1)

)}if(tmp > nums.

get(j)

)else

if(tmp == nums.

get(j)

)else

}else

} nums.

set(start,tmp)

; words2.

set(start,tmps);}

}

o(nlogk)

o(n)

不要使用

arrays.sort(arr) arrays.copyof(arr, k)、priorityqueue等方法或類,

面試官不會滿意,同時有可能自己面試時可能忘記函式名。

Leetcode 前k個高頻元素

思路大概是將陣列中所有元素的頻率記下來,然後統一使用最小堆來管理,將根節點與下乙個元素比較,將頻率更的高元素插入最小堆,同時進行堆排序操作,以此進行管理 在這裡發現原來c 有優先佇列priority queue可以達到相同的效果,優先佇列將權值最大的放在佇列的出口處,這樣就完成了類似的效果 原演算法...

LeetCode 前K個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log...

leetcode 前K個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 思路 利用資料結構,map來新增。因此map中記錄了nums i 為key,出現的次數count為values。之後通...