求數列第K大的數 ACdream 1099

2021-08-14 23:20:01 字數 1034 閱讀 2734

求第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元素在右邊序列,遞迴右...