在乙個無序的整數陣列中選取重複頻率最高的前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,...