劍指offer 最小的k個數

2021-08-21 21:43:48 字數 950 閱讀 1128

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。

方法1:

最直觀的方法就是先將陣列排序,然後下標最小的k個就是最小的k個數字,時間複雜度為o(nlogn)。

方法2:

可以借鑑選擇排序的思想,每次遍歷未排序陣列找到最小的乙個放到排序陣列的末尾,因為只要找到最小的k個所以只需要k次迴圈,時間複雜度o(nk)。可以衡量n和k的大小在方法1和方法2中選擇。但這兩種方法都不適用於n特別大的情況。

方法3:時間複雜度o(n),只有當可以改變原始陣列時才可以用。

借鑑快速排序的思想,使用partition函式(見各種排序演算法),每次取乙個基準值,比基準值小的數都移到其左邊,比基準值大的數都移到其右邊,返回基準值的下標,因此只要排到基準值下標為k-1,則基準值左邊的數加上基準值就是最小的k個數。

方法4:利用最大堆,空間換時間,時間複雜度o(nlogk),適用於n很大k較小的情況。

建立乙個大小為k的最大堆,每次從n個數字中讀取乙個,如果堆中數字少於k個,就直接將資料放入堆中,並將堆調整為最大堆,這樣,堆頂元素始終是當前堆中最大的數。當堆中數字滿k個之後,新讀進來的數字與堆頂元素比較,如果比它大,則一定不屬於最小的k個數,如果比它小,就把堆頂元素替換掉,重新調整堆為最大堆。當讀完所有數字之後,堆中留下的k個數就是最小的k個數。

ac**

方法3

class solution    

}for(int i=0;i&input, int low, int high)

swap(input[i],input[j]);

}int p;

if(input[i]>base)

p=i-1;

else

p=i;

swap(input[p],input[pos]);

return p;

}};

劍指offer 最小k個數

1.題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,2.方法 1 基於堆排序演算法,構建最大堆。時間複雜度為o nlogk 2 如果用快速排序,時間複雜度為o nlogn 3 如果用插入排序,時間複雜度為o n 2 3.演...

劍指offer 最小的K個數

華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 10 4 題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,解析 基於插入排序的思想可以想到使用乙個長度為k的排序陣列儲存最小的k個元素,複雜度o nk 基於...

《劍指offer》最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,輸入給整數陣列,和k 找出其中最小的k個數 class solution 1 先用插入排序對陣列中數進行排序。2 取出有序陣列中最小的kge。附 這只是乙個比較簡單的方法。如果考慮...