力扣347 前 K 個高頻元素

2021-10-02 11:23:25 字數 1753 閱讀 9322

這道題主要涉及的是對資料結構裡雜湊表、小頂堆的理解,優化時可以參考一些排序方法。

給定乙個非空的整數陣列,返回其**現頻率前 k 高的元素。

示例 1:

輸入: nums = [1,1,1,2,2,3], k = 2

輸出: [1,2]

示例 2:

輸入: nums = [1], k = 1

輸出: [1]

說明:

原題url:

為了解決這道題,我們首先需要知道每個元素出現的次數。最方便的話,可以使用雜湊表,因為這就是乙個數字——出現次數的對映關係。此處的時間複雜度為o(n)

其次,因為需要查詢頻率前 k 高的元素,所以我們肯定是需要排序的,時間複雜度為o(n log n)的排序方法有許多,快速排序、堆排序等,我是用的堆排序,使用小頂堆,這樣在每次入堆的時候,檢查一下堆的個數是否超過 k,如果超過,則移除堆頂的元素(也就是次數最少的元素)。

這樣堆裡剩餘的元素也就是最終的結果了,接下來我們看看**:

class solution 

// 利用priorityqueue構建小頂堆

priorityqueueheap = new priorityqueue((n1, n2) -> countmap.get(n1) - countmap.get(n2));

setkeyset = countmap.keyset();

for (int key : keyset)

}listresult = new linkedlist<>();

iteratoriterator = heap.iterator();

while (iterator.hasnext())

return result;}}

提交ok。

針對排序,我想到了乙個優化,利用桶排序,其時間複雜度為o(n),主要是浪費空間,因為需要申請額外的陣列,下標代表出現的次數,元素我用的是 linkedlist,這樣可以儲存多個。那麼這個在進行輸出時,只要從後往前進行遍歷,當結果的數量達到 k 時,就可以停止了。

接下來我們看看** :

class solution 

countmap.put(num, count);

}// 桶排序,構建陣列,下標為重複的次數

linkedlist array = new linkedlist[maxcount 1];

for (map.entryentry : countmap.entryset())

list.add(key);

}// 倒著遍歷陣列,直到找到k個元素

listresult = new linkedlist<>();

for (int i = array.length - 1; i >= 0 && result.size() < k; i--)

result.addall(list);

}return result;}}

提交ok。

力扣347 前 K 個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前k高的元素。你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log n n 是陣列的大小。題目資料保證答案唯一,換句話說,陣列中前 k 個高頻元素的集合是唯一的。你可以按任意順序返回答案。思路 t...

347 前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...

347 前 K 個高頻元素

維護乙個size是k的堆。求前k大的數,用小根堆 求前k小的數,用大根堆 求前k大,當堆的sizek時,去掉堆頂,最終堆中的資料就是最後的答案。如陣列arr 求最大的前3個數 一般來說求前k大 小,陣列中數是很大的,直接用排序,在選擇前k大 小的話,效率不高 首先建立堆,其size 0,一直push...