求第k大的數,經常會想到主席樹,但是主席樹**複雜,操作複雜,如果說單純的求數列第k大的數,那麼就顯得優點大材小用了,就像acdream 1099 這道題目,就是求數列中第k大的數,而且如果有重複的話也算在第k大之內,例如:如果數列是,要求第一大的數,顯然就是3,第二大的數也顯然就是2,這都沒有疑問,但是第三大的數是1還是2呢?對於這道題而言,第三大的是2,第四大的是1
看到這道題,很多人會直接想到sort一下,然後找到第k個數就可以了,但是sort是tle的,實際上他考察的是分治思想,自己寫乙個排序規則,但是要進行一些優化
首先解讀一下分治、排序、優化**
//求數列中第k大的數字
int sort_up_kth(int left,int right,int n,int k)
}//實際上在這個數列中,只排好了前k大的數字,其他數字都是在後面亂序的
這就是求解序列第k大的數字,簡單理解一下原理(我寫的並不詳細,還請見諒),就可以輕鬆的推導出第k小的數字的求解方法了
#include
#include
#include
#include
using namespace std;
int a[5000005];
int sort_up_kth(int left,int right,int n,int k)
}int sort_down_kth(int left,int right,int n,int k)
}int main()
return
0;}///6 3
///1 2 3 4 5 6
///第3大的數字是4
///第3小的數字是3
///6 4
///1 2 3 4 4 4
///第4大的數字是3
///第4小的數字是4
///6 4
///1 3 2 1 2 3
///第4大的數字是2
///第4小的數字是2
本人能力有限,如有錯誤,還請批評指正 求陣列第K大的數
問題 有乙個大小為n的陣列a 0,1,2,n 1 求其中第k大的數。我們先分析原問題 有乙個大小為 n的陣列a 0,1,2,n 1 求其中第k大的數。我們先取特例,令k 1,那麼就是取最大的數,只要掃瞄一遍陣列就可以確定該值,如果k 2,則掃瞄兩邊陣列就可以確定第二大的數,依此類推下去,時間複雜度是...
求陣列中第K大的數
本題的的陣列是可以包含重複元素的,且要求時間複雜度控制在o n 解題思路 陣列中第k大的數等價於排序陣列中第n k個數,直觀的想法是將陣列排序後取第n k個數即可,但是最快的排序演算法時間複雜度也是o nlogn 可以參考快速排序一次劃分的思想,將時間複雜度降低為o n 一次劃分可以講陣列分為三部分...
求陣列中第k大的數
文章裝載自 使用快排,第一趟快排過後,右邊的元素都比樞軸大,左邊的都比樞軸小。當我們要求第k大的數,只需要左邊的元素個數是len k,len是陣列總長度。第一次快排下來,設樞軸位置是mid,如果mid k,說明第k大元素應該在左邊序列中,遞迴左邊序列。當 mid k 時,說明k元素在右邊序列,遞迴右...