劍指offer第40題 最小的K個數

2021-10-14 16:27:39 字數 2453 閱讀 1582

題目描述:輸入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...