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