java返回N個數中最大的前M個數
阿新 • • 發佈:2018-12-15
給定一個非空的整數陣列,返回其中出現頻率前 k 高的元素。 思路:將前k個數裝入佇列,向後遍歷,如果得到的數和佇列首的頻率進行比較,如果大於,則交換堆頂的元素和當前元素。直到遍歷完成
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
//對元素進行對映
TreeMap<Integer, Integer> map = new TreeMap<>();
for (int num : nums) {
map. put(num, !map.containsKey(num) ? 1 : map.get(num) + 1);
}
//給優先佇列傳入比較動作
PriorityQueue<Integer> pq = new PriorityQueue<>((Comparator.comparingInt(map::get)));
for (Integer key : map.keySet()) {
if (pq.size() < k) {
pq.add(key);
} else if (map.get(key) > map.get(pq.peek())) {
pq.remove();
pq.add(key);
}
}
List list = new LinkedList<Integer>();
while (!pq.isEmpty()) {
list.add(pq.remove());
}
return list;
}
}
時間複雜度: 有n個元素: O(NlogM)