劍指offer40 最小的k個數

2021-09-24 17:34:01 字數 2020 閱讀 1355

輸入n個整數,找出其中最小的k個數。

注意

資料保證k一定小於等於輸入陣列的長度;

輸出陣列內元素請按從小到大順序排序;

樣例

輸入:[1,2,3,4,5,6,7,8] , k=4

輸出:[1,2,3,4]

思路1

用大頂堆儲存k個數,然後不斷的遍歷陣列,若是陣列中的數小於堆頂元素,則替換。實踐複雜度為o(nlogk)。

acwing-53 c++ code

class

solution;}

int n = input.

size()

; priority_queue<

int, vector<

int>

, less<

int>> k_nums;

for(

int i =

0; i < n; i++

)else

if(input[i]

< k_nums.

top())

} vector<

int> res;

while

(!k_nums.

empty()

)return res;}}

;

思路2

快速排序的思想。平均時間複雜度為o(n)。

c++ code

class

solution

swap

(nums[i]

, nums[j]);

while

(j > i && nums[i]

< midnum)

swap

(nums[i]

, nums[j]);

}if(k < j +1)

else

if(k > j +1)

} vector<

int>

getleastnumbers_solution

(vector<

int> nums,

int k);}

quicksort

(nums, k,

0, nums.

size()

-1);

vector<

int>

res(nums.

begin()

, nums.

begin()

+ k)

;sort

(res.

begin()

, res.

end())

;return res;}}

;

思路3

先找出k個數,然後每遍歷一次剩下的數的時候,如果該數小於k個數中的最大值,就把這個最大值替換掉。時間複雜度為o(nk)。

c++ code

class

solution

int max;

int index;

for(

int i =

0; i < input.

size()

; i++

) max = res[0]

; index =0;

for(

int i =

1; i < k; i++)}

if(max > input[i])}

sort

(res.

begin()

, res.

end())

;return res;}}

;

劍指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...

劍指 Offer 40 最小的k個數

輸入整數陣列 arr 找出其中最小的 k 個數。例如,輸入4 5 1 6 2 7 3 8這8個數字,則最小的4個數字是1 2 3 4。示例 1 輸入 arr 3,2,1 k 2 輸出 1,2 或者 2,1 示例 2 輸入 arr 0,1,2,1 k 1 輸出 0 限制 0 k arr.length ...