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中查詢元素位置的方法複...