比較簡單吧
方法 1 快排取前k個
方法2 不快排,遞迴求partion,時間 複雜度o(n)吧
#include "stdio.h"
int partion(int *data,int s,int e)
};void getlistk(int *data,int start,int len,int k,multiset&myset)
} }}int main()
; int k;
int len = sizeof(data)/sizeof(data[0]);
scanf("%d",&k);
multisetmyset;
getlistk(data,0,len,k,myset);
multiset::iterator iter;
for(iter=myset.begin();iter != myset.end();iter++)
cout<
return 0;
}
據說multiset是使用紅黑樹實現的插入和刪除都是logk的複雜度,同時我定義最大元素在最前面,這樣直接取第乙個元素就行咯。
好方法,多總結。
multiset可以執行容器包含相同元素
而set則不可以
找最小的k個數(優先佇列)
描述 青大最優雅的程式設計師kkun一直友好 的致力於為學妹們出一道做法優雅而且非常簡單的題。例如著名的 一道非常簡單的爐石題 一道非常簡單的簽到題 一道非常簡單的數學題 一道非常簡單的平衡樹套替罪羊樹套喜羊羊樹套聖誕樹套動態仙人掌 一道非常簡單的簽到題 這個人是真的優雅,比那個菜凡不知道高到 去了...
面試題40 最小k個數
題目 輸入n個整數,找出其中最小的k個數 思路 1 如果輸入的陣列可以改變,則基於第k個數來調整,是第k個數左邊的數都小於第k個數,右邊的數都大於第k個數 時間複雜度o n 思路1 void printkminnumberbymethod1 int arr,int length,int k int ...
面試題之最小K個數
最小 最大k個數 是面試容易提及的其中乙個問題,此處用快排思路解決。思路 因為當選取的樞紐元等於k時,樞紐元左邊的序列元素必定小於k,右邊的序列元素必定大於k。儘管序列內部是無序的,但此時結果已符合題意。為避免產生多餘的排序工作,我們只需要在遞迴的時候分歧選擇最接近k的方向即可,一旦等於k就停止遞迴...