劍指offer 輸入n個整數,找出其中最小的K個數

2022-09-12 09:18:12 字數 954 閱讀 9915

最小的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...