347. 前 k 個高頻元素思路:要統計元素出現次數(通過map:cnt)給定乙個非空的整數陣列,返回其**現頻率前 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 n) , n 是陣列的大小。
題目資料保證答案唯一,換句話說,陣列中前 k 個高頻元素的集合是唯一的。
你可以按任意順序返回答案。
對次數排序(通過優先順序佇列:pq)
找出前k個高頻元素
時間複雜度:o(nlogk),n 表示陣列的長度。首先,遍歷一遍陣列統計元素的頻率,這一系列操作的時間複雜度是 o(n);接著,遍歷用於儲存元素頻率的 map,如果元素的頻率大於最小堆中頂部的元素,則將頂部的元素刪除並將該元素加入堆中,這裡維護堆的數目是 k,所以這一系列操作的時間複雜度是 o(nlogk) 的;因此,總的時間複雜度是 o(nlogk)。
空間複雜度:o(n),最壞情況下(每個元素都不同),map 需要儲存 n 個鍵值對,優先佇列需要儲存 k 個元素,因此,空間複雜度是 o(n)。
vectortopkfrequent(vector& nums, int k)
// for (auto kv : cnt) );
// while (pq.size() > k) pq.pop();
// }
for (unordered_map::iterator it = cnt.begin(); it != cnt.end(); it++)
); // 根據map中的key(次數)來排序,value為次數對應的元素值
if (pq.size() > k) // pq始終維護長度為k的佇列(此處提前限定了pq長度為k,下面while不用for (int i = 0; i < k; i++) 了)
這道題做的快自閉了,stl的優先順序佇列剛開始自己寫語法都有問題 = = !哎難受~
補充一波go實現的解法,不過可能時間複雜度不滿足題目要求的優於o(n log n),因為排序過程也有自己的時間複雜度,且算是一種方法吧 - - !
func topkfrequent(nums int, k int) int
// 2.將map轉為結構體陣列,再利用sort包按結構體的val"從大到小"排序
type kv struct
kvslice := make(kv, 0)
for k, v := range m
} sort.slice(kvslice, func(i, j int) bool )
fmt.println(kvslice)
// 3.輸出前k個高頻元素
Leetcode 347 前K個高頻元素
給定乙個非空的整數陣列,返回其 現頻率前k高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 首先都要先用hash表統計一次頻率,乙個思路是排序,取前k個元素 第二個思路是使用優先佇列,這裡提供兩種 class so...
Leetcode347 前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 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 ...