劍指 Offer 40 最小的k個數

2021-10-21 06:20:19 字數 1472 閱讀 7332

思路一:

注意找前 k 大/前 k 小問題不需要對整個陣列進行 o(nlogn)o(nlogn) 的排序!

例如本題,直接通過快排切分排好第 k 小的數(下標為 k-1),那麼它左邊的數就是比它小的另外 k-1 個數啦

思路二(容易理解一點):

利用大頂堆

思路一:

class

solution

// 最後乙個引數表示我們要找的是下標為k-1的數

return

quicksearch

(arr,

0, arr.length -

1, k -1)

;}private

int[

]quicksearch

(int

nums,

int lo,

int hi,

int k)

// 否則根據下標j與k的大小關係來決定繼續切分左段還是右段。

return j > k?

quicksearch

(nums, lo, j -

1, k)

:quicksearch

(nums, j +

1, hi, k);}

// 快排切分,返回下標j,使得比nums[j]小的數都在j的左邊,比nums[j]大的數都在j的右邊。

private

intpartition

(int

nums,

int low,

int high)

while

(nums[i]

<=temp&&iif(i}//兩指標重合後:交換基準

nums[low]

=nums[i]

; nums[i]

=temp;

return j;

}}

思路二:

class

solution;}

priorityqueue

<

integer

>

maxheap=

newpriorityqueue

<

>(3

,(integer a,

integer b)

->);

maxheap.

add(arr[0]

);for(

int i=

1;i)else}}

int[

] res=

newint

[k];

int size=maxheap.

size()

;for

(int i=

0;i)return res;

}}

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