出現次數前k多的元素 桶排序

2021-10-06 12:34:15 字數 1536 閱讀 5724

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 個高頻元素的集合是唯一的。

普通做法,先統計各個數的頻率,然後把頻率和數放進二維陣列,再進行排序

class

solution

int[

]num=

newint

[map.

size()

][2]

;int j=0;

for(

int a:map.

keyset()

) arrays.

sort

(num,

newcomparator

<

int[

]>()

else}}

);for(

int i =

0;i < k;i++

)return res;

}}

桶排序做法:也是先統計各個數頻率,將頻率作為陣列下標,同個下標放置相同頻率的數列表,從後往前按順序取得頻率前k高元素

這種做法既是只有o(n)的時間複雜度,同時空間複雜度也不大,因為桶排序的陣列大小只需要等於原陣列長度即可(整個陣列只有乙個數的情況)!

class

solution

list

bucket =

newarraylist

[nums.length +1]

;for

(int key : map.

keyset()

) bucket[value]

.add

(key);}

int j =0;

for(

int i = bucket.length-

1;i >=

0;i--)if

(bucket[i]

!= null)}}

return res;

}}

關於list的null和isempty(),之前一直沒講究,今天學習了不同

list==null,未被初始化,沒有儲存的位址。

list.size()=0是已初始化,但是並沒有存相應的元素。

list.add(null)會造成list.isempty() 為false,list.size()為1, 所以**裡要避免list.add(null)的陷阱 。

做判斷的時候經常連用list!=null && list.size()!=0

在大量URL中,查詢出現次數前K多的URL

include include include include include include using namespace std using namespace stdext void findtopktimes const string filename priority queue,vec...

求乙個陣列中出現次數前k種的元素

map fruitcount 建立map物件 for int i 0 i sizeof fruits sizeof fruits 0 i else 缺點 如果map中沒有要插入的這個水果,則需要遍歷兩次map。思路二 只遍歷一次map insert的返回值pair。既然不管是否插入成功,它都能返回我...

排序數列中元素出現次數問題

於 排序數列中元素出現次數問題 這裡採用折半法給出兩種思路 1 找到元素在陣列中的乙個索引位置,由於是陣列是有序排列,所有在這個位置左右移動,就可以找出其所有出現的位置 2 通過折半法找到元素的最大索引位置與最小索引位置,然後兩個索引位置相減再加一,就是元素的出現的次數。方法1中查詢元素位置的方法複...