劍指Offer對答如流系列 最小的k個數

2022-08-30 02:18:08 字數 923 閱讀 2828

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

最容易想到的方法就是排序,取相應數字的元素即可。我這裡為了方便直接使用了快排來做這個。

想拉開與別人的差距,難免需要優化時間效率,我們可以這樣做:依次遍歷n個整數,用乙個容器存放最小的k個數字,每遇到比容器中最大的數字還小的數字時,將最大值替換為該數字。容器可以使用最大堆或者紅黑樹來實現。堆相比紅黑樹更容易實現,我們這裡採用堆。

思路一(不推薦)

public arraylistgetleastnumbers(int  input, int k) 

int start=0;

int end=input.length-1;

int index=partition(input,start,end);

while(index!= k-1)else

}for(int i=0;i=pivotkey)

swap(arr,start,end);

while(start思路二(推薦)

public arraylistgetleastnumbers(int input, int k)

int numbers=new int[k]; //用於放最小的k個數

//先放入前k個數

system.arraycopy(input, 0, numbers, 0, k);

for(int i = k/2-1; i>=0; i--)

for(int i = k; iarr[child])

if(arr[child]arr[start]=arr[child];

start=child;

child=child*2+1;

}arr[start]=temp;

}

劍指Offer對答如流系列 醜數

我們把只包含質因子2 3和5的數稱作醜數 ugly number 求按從小到大的順序的第n個醜數。例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。判斷乙個數是不是醜數,最容易想到的方法就是讓這個數不斷除以2,3,5。對於第n個醜數,只要從1開始,依次判斷每個數是不...

劍指Offer對答如流系列 剪繩子

給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k m k 0 k 1 k m 可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到最大的乘積18。遇到問題,先分析問題,由分析的結果確定所運用的演...

劍指Offer對答如流系列 把陣列排成最小的數

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這3個數字能排成的最小數字321323。之前我們做過字元全排列的習題 劍指offer對答如流系列 字串的排列,但是將演算法思想應用到這一題的話,效果不好,求出所有的組合,再計算出組合的最...