劍指 Offer 40 最小的k個數

2022-09-19 22:03:17 字數 1239 閱讀 8821

劍指 offer 40. 最小的k個數

做這題有很多辦法,如果內建了sort函式的語言,就比較簡單,可以先排序,再取前k個數即可。

class solution 

}

時間複雜度為\(o(nlogn)\),空間複雜度為\(o(k)\)。

或者手寫快排,這裡正好複習一下快速排序的原理。

class solution 

private void quicksort(int arr, int lo, int hi)

}quicksort(arr, lo, r);

quicksort(arr, r + 1, hi);}}

快排屬於分治問題,分治一般分為3步:

①.劃分為子問題;

②.遞迴處理子問題;

③.合併子問題;

void quick_sort(int q, int l, int r)

//第二步:遞迴處理子問題

quick_sort(q, l, j), quick_sort(q, j + 1, r);

//第三步:子問題合併.快排這一步不需要操作,但歸併排序的核心在這一步驟

}

證明過程如下link

也可以使用大根堆,如果堆的大小小於k,則先將數字入堆,否則,比較當前元素和堆頂元素大小,堆頂是目前這7個元素中最大的元素,如果當前元素比堆頂的大,那麼肯定不是前k個元素,直接跳過即可,如果比堆頂元素要小,先將堆頂元素出堆,這樣才能使更小的元素入堆,最後重複上述過程,直到遍歷完陣列,再將堆中元素返回即可。

class solution 

// 預設是小根堆,實現大根堆需要重寫一下比較器。

queuepq = new priorityqueue<>((v1, v2) -> v2 - v1);

for (int num: arr) else if (num < pq.peek())

}// 返回堆中的元素

int res = new int[pq.size()];

int idx = 0;

for(int num: pq)

return res;}}

時間複雜度\(o(nlogk)\),空間複雜度\(o(k)\)。

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