選取重複頻率最高前k個數

2021-10-04 01:33:53 字數 2249 閱讀 8550

在乙個無序的整數陣列中選取重複頻率最高的前k個數,例如:整數陣列[3,4,5,6,4,3,5,2,3],k=3,則結果集為[3,5,4]。

第一種方法暴力解法:對所有數的頻率進行統計,然後用排序演算法進行排序找出前k個頻率最高的數。

如果我們按相對來說最優的排序演算法快速排序來進行查詢,快速排序**如下:

public

static

void

quicksort

(int

a,int left,

int right)

int v = a[left]

;int l = left +1;

int r = right;

while

(l < r)

if(a[r]

>= v)

int temp = a[l]

; a[l]

= a[r]

; a[r]

= temp;

l++; r--;}

if(a[left]

> a[l]

)else

quicksort

(a,left,l-1)

;quicksort

(a,l+

1,right)

;}

快速排序的時間複雜度不低於nlogn,統計的時間複雜度為n,

所以這種方法的最終時間複雜度為o(nlogn),空間複雜度為o(n)。

第二種方法是利用堆排序:將統計頻率用最小堆進行排序,設定堆的最大值,超過最大值時將小的頻率替換,最後堆剩下的值就是頻率最高的數值。

這裡統計頻率用map儲存。**如下:

//用map對數的頻率進行統計

public

static

void

conut

(int

a)else}}

//利用堆排序

public

static

int[

]dumpsort

(map

map,

int k)})

;for

(integer i : map.

keyset()

)else

if(map.

get(priorityqueue.

peek()

)< map.

get(i))}

int[

] res =

newint

[k];

for(

int i =

0; i < k; i++

)return res;

}

這裡維護堆的數目是k,操作的數量是n,堆是二叉樹的形式,所以每次維護堆的時間複雜度為logk,又因為總量是n,所以排序的時間複雜度為o(nlogk)。統計頻率的時間複雜度為o(n),所以總的時間複雜度為o(nlogk)。空間複雜度中因為維護頻率的map需要n,堆的數量需要k,一共需要的空間複雜度為

n+k,記為o(n)。

第三種是最優的演算法利用桶排序:將統計後頻率相同的數值放進同乙個桶裡,最後倒著從大的桶裡開始取值,取出的量達到k位置。這裡用list陣列來表示不同的桶,list[i]用所以i來表示頻率,list[i]其中的數值表示其中該頻率的數值有哪些。**如下:

public

static

void

conut

(int

a)else}}

public

static list

bucketsort

(int k)

lists[i]

.add

(key);}

int length = lists.length;

for(

int i = length -

1; i >=

0&& res.

size()

< k; i--

) res.

addall

(lists[i]);

}return res;

}

這裡只需要遍歷一次即可,所以時間複雜度為n,統計頻率的時間複雜度為n,所以最終時間複雜度表示為o(n)。每個數值只重複儲存了一次,所以空間複雜度為o(n)。

2021 3 15刷題 組合總和(元素可重複選取)

題目描述 給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。示例 1 輸入 c...

leetcode day01 無重複字元的最長子串

3.無重複字元的最長子串 給定乙個字串,找出不含有重複字元的最長子串的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是 子串行...

LeetCode題庫練習之無重複字元的最長子串

參考自 題目描述 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。解題思路 運用滑動視窗的思想,從字串第乙個位置開始遍歷,當出現重複字元時,移除最左邊的字元。直至沒有重複的字元時停止。class solution lookup.insert s i maxstr max maxstr,...