該問題我們可以先維護乙個大小為k的陣列karr,然後遍歷n個整數,當某個值比karr的最大的還要小時,就更新該陣列。**如下:
#include
#include
#include
#include
using namespace std;
void display(int intarr, int length)
cout << endl;
}int getmin(int intarr, int length)//獲取維護陣列的最大值
}return maxi;
}int getmink(int intarr, int length, int k)
for (int i = 0; i < length; i++)
}return mink;
}int main()
display(intarr, 20);
int *mink = getmink(intarr, 20, 5);
sort(intarr, intarr + 20);
display(intarr, 20);
display(mink, 5);
system(「pause」);
return 0;
}在c++的演算法中,我們可以採用大小堆來求出最小的k個數字。c++的stl中已經提供了的multiset的容器,該容器預設從小到大排序,而且可以放重複資料。我們直接拿過來用即可。
#include
#include
#include
#include
#include
#include
using namespace std;
void findmink(multiset&intheap, int intarr, int length, int k)
else}}
}int main()
/display(intarr, 20);
int *mink = getmink(intarr, 20, 5);
sort(intarr, intarr + 20);
display(intarr, 20);
display(mink, 5);
*/display(intarr, 20);
sort(intarr, intarr + 20);
display(intarr, 20);
findmink(intheap, intarr, 20, 5);
for (auto x : intheap)
cout << endl;
system(「pause」);
return 0;
}大頂堆的演算法時間複雜度明顯小於第一種演算法,第一種每一次遍歷乙個資料都需要查詢k次,那麼對n的陣列來說,那麼複雜度為nk。
但是由於大頂堆在內部實現上是二叉樹實現,每次查詢就是二叉樹的查詢,即使有一千個資料,查詢次數最多為1+2+4+8+16+32+64+128+256+512,最多為10次,大大提高了執行的效率。
而且c++有許多stl都非常好用,以後要多多學習啊。
輸入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...
輸入n個整數,輸出其中最小的k個
輸入n個整數,輸出其中最小的k個。詳細描述 介面說明 原型 bool getmink unsignedint uiinputnum,int pinputarray,unsignedint uik,int poutputarray 輸入引數 unsignedint uiinputnum 輸入整數個數 ...