最小的k個數
題目描述輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
本題無非就是排序,取前k個值。但選什麼排序演算法呢?
基於堆排序演算法,構建最大堆。時間複雜度為o(nlogk);
如果用快速排序,時間複雜度為o(nlogn);
如果用氣泡排序,時間複雜度為o(n*k);
這類題目要考的應該是堆排序的改造。在n 較大,k較小的情況下。
改造的堆排序:
1.將前k個元素構造成最大堆(0~k-1)
2.從k位開始,依次與最大堆的堆頂元素進行比較。如果比堆頂小,則該數與堆頂交換位置,維護最大堆
3.最後從k-1~0的數是最小的k的數
思考:
為什麼在求最小的k個數,不是建立最小堆而是建立最大堆???
建立最大堆的情況下,判斷從k~n-1位的數是否有可能是最小的k個數,只需與堆根進行比較,當它比跟堆大的時候,它肯定比堆內其他數都大,即它無希望排進前k個數。若有希望排進,那麼需將目前堆內最大的數趕出,正好又是堆根,兩者交換即可。
**:
import j**a.util.*;
public
class solution
for(int i=k/2-1;i>=0;i--)
for(int j=k;jif(input[j]0])
}for(int i=k-1;i>=0;i--)
return array;
}public
void
buildmaxheapsort(int input,int i,int k)
}public
void
swap(int input,int a,int b)
}
n個骰子 劍指offer
暴力求解,n個骰子和為s就等於n 1個骰子和分別為s 1 s 6時次數的總和。據此寫出 如下 int baoli int n,int s int count 0 count baoli n 1,s 1 baoli n 1,s 2 baoli n 1,s 3 baoli n 1,s 4 baoli n...
輸入n個整數,找出其中最小的K個數
輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,牛客網題目鏈結 使用最大堆實現,1.構建大小為k的最大堆 2.如果新元素小於當前最大堆的堆頂元素,則替換堆頂,調整最大堆 3.題目要求按照從小到大順序輸出最小的k個數,所以最後需要...
輸入n個整數,找出其中最小的K個數。
題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,思路 可以使用排序 這裡我採用快排,獲取到乙個有順序的陣列,然後獲取它的前n個 先使用快排排序 public static void quicksort int arr,in...