LeetCode 347 前 K 個高頻元素

2021-10-09 00:04:27 字數 1982 閱讀 5792

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 n) , n 是陣列的大小。

題目資料保證答案唯一,換句話說,陣列中前 k 個高頻元素的集合是唯一的。

你可以按任意順序返回答案。

思路:要統計元素出現次數(通過map:cnt)

對次數排序(通過優先順序佇列:pq)

找出前k個高頻元素

時間複雜度:o(nlogk),n 表示陣列的長度。首先,遍歷一遍陣列統計元素的頻率,這一系列操作的時間複雜度是 o(n);接著,遍歷用於儲存元素頻率的 map,如果元素的頻率大於最小堆中頂部的元素,則將頂部的元素刪除並將該元素加入堆中,這裡維護堆的數目是 k,所以這一系列操作的時間複雜度是 o(nlogk) 的;因此,總的時間複雜度是 o(nlog⁡k)。

空間複雜度: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 ...