347 前 K 個高頻元素

2021-10-02 20:19:05 字數 1852 閱讀 6616

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

示例 1:

示例 2:

說明:你可以假設給定的 k 總是合理的,且 1 ≤ k ≤ 陣列中不相同的元素的個數。

你的演算法的時間複雜度必須優於 o(n log n) , n 是陣列的大小。

首先使用雜湊表統計陣列元素的頻率,統計完成後,建立乙個二維陣列,將頻率作為陣列第乙個維度的下標,將元素作為第二個維度的值,當出現不同的元素頻率相同時,直接新增到第二個維度即可。倒序遍歷二維陣列,區前k個高頻元素。

class

solution

//二維陣列第一維下標是數字出現的頻率

vector

int>>

buckets

(nums.

size()

+1);

for(

auto iter = m.

begin()

;iter != m.

end();

++iter)

vector<

int>

res(k)

;int count =0;

//記錄是第幾高的頻率

//將buckets前k個高頻元素放入res中

for(

int i = buckets.

size()

-1;i >=0;

--i)}}

return res;}}

;

時間複雜度:o(n),n 表示陣列的長度。首先,遍歷一遍陣列統計元素的頻率,這一系列操作的時間複雜度是 o(n);桶的數量為 n + 1,所以桶排序的時間複雜度為 o(n);因此,總的時間複雜度是 o(n)。

空間複雜度:o(n)

用雜湊表儲存陣列每個元素出現的頻率,把元素和相應的頻率構造成pair儲存到vector中,對vector進行倒序排序,排序標準時元素的頻率。把第k高的頻率移動到正確的位置,則k之前的元素的頻率都大於第k個元素的頻率,把這部分元素存入結果陣列res中。

class

solution

vector

int,

int>>

data

(m.begin()

,m.end()

);int left=0;

int right = data.

size()

-1;int index =

partiton

(data,left,right)

;while

(index != k-1)

else

index =

partiton

(data,left,right);}

vector<

int> res;

for(

int i =

0;i < k;

++i)

return res;

}int

partiton

(vector

int,

int>>

& nums,

int left,

int right)

}swap

(nums[t]

,nums[right]);

return t;}}

;

時間複雜度:o(n)

空間複雜度:o(n)

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

347 前 K 個高頻元素

方法很好想,要麼暴力排序,歸併,堆排都能滿足o nlogn 的要求。我第一次想到的就是,用雜湊統計一下數字,然後過載排一下序,順序放入集合裡就行。這次用的是最小堆,主要學習一下priorityqueue,是基於優先順序堆的無界優先順序queue modifier and type method an...