題目描述:輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。
示例1
輸入:[4,5,1,6,2,7,3,8],4
返回值:[1,2,3,4]
對原陣列從小到大排序後取出前 k 個數即可。
vector<
int>
getleastnumbers
(vector<
int>
& arr,
int k)
return v;
}
複雜度分析
實現原理:基於陣列的第k個數字來調整,使得比k個數字小的所有數字都位於陣列的左邊,比第k個數字大的所有數字都位於陣列的右邊,經過這樣的調整後,位於陣列中左邊的k個數字就是最小的k個數字。
class
solution
array[low]
= array[high]
;while
((low < high)
&&(array[low]
<= piv)
) array[high]
= array[low];}
array[low]
= piv;
return low;
}void
quicksort
(vector<
int>
& input,
int low,
int high,
int k)
else
if(pivot > k)
else
}
vector<
int>
getleastnumbers_solution
(vector<
int> input,
int k)
int low =0;
int high = input.
size()
-1;quicksort
(input, low, high, k)
;for
(int i=
0; i)return ret;}}
;
時間複雜度為:o(n
)\omicron(n)
o(n)
每次partition的大小為n+n/2+n/4+... = 2n
,最壞時間複雜度為o(n^2)
, 因為每次partition都只減少乙個元素
空間複雜度:o(1
)\omicron(1)
o(1)
實現原理:先把前 k 個資料建立乙個大根堆,然後對後面的length-k
個數依次遍歷,如果當前數值小於堆頂的值時,則替換堆頂的值,然後對大根堆做向下調整。
可以採用優先順序佇列,c++中的優先順序隊列為大根堆。
class
solution
if(right < length && input[right]
> input[max]
)//最大值不是父節點,則進行交換
if(max != i)
} vector<
int>
getleastnumbers_solution
(vector<
int> input,
int k);}
vector<
int> result;
//建立堆
for(
int i = input.
size()
/2-1
; i >=
0; i--
)//將後面的數依次和k個數的最大值比較
for(
int i = k; i < input.
size()
; i++)}
for(
int i =
0; i < k; i++
)return result;}}
;
時間複雜度:o(nlongk), 插入容量為k的大根堆時間複雜度為o(longk), 一共遍歷n個元素
空間複雜度:o(k)
當k數值比較小時,可採用快速排序;當原陣列中的資料順序不可修改,且k數值很大時(海量資料),採用快速排序可能會佔滿記憶體,效率不高。此時使用最大堆資料結構實現最好。
(nlongk), 插入容量為k的大根堆時間複雜度為o(longk), 一共遍歷n個元素
空間複雜度:o(k)
當k數值比較小時,可採用快速排序;當原陣列中的資料順序不可修改,且k數值很大時(海量資料),採用快速排序可能會佔滿記憶體,效率不高。此時使用最大堆資料結構實現最好。
leetcode解題思路
劍指offer40 最小的k個數
輸入n個整數,找出其中最小的k個數。注意 資料保證k一定小於等於輸入陣列的長度 輸出陣列內元素請按從小到大順序排序 樣例 輸入 1,2,3,4,5,6,7,8 k 4 輸出 1,2,3,4 思路1 用大頂堆儲存k個數,然後不斷的遍歷陣列,若是陣列中的數小於堆頂元素,則替換。實踐複雜度為o nlogk...
劍指offer40 最小的 K 個數
題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,思路 方法一 維護乙個大小為k的大頂堆,複雜度 o nlogk o k 特別適合處理海量資料 public class solution priorityqueuemax...
劍指offer40 最小的k個數
問題描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,方法1 o nlogn def getleastnumbers input,k input.sort return input 4 a sorted input inpu...