給一非空的單詞列表,返回前 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。之後通...