一、問題**
給定乙個整數數列a[1..n],其中每個元素都不相同,你的程式要能回答一組格式為q (i , j , k)的查詢,q(i, j ,k)的意思是「在a[i..j]中第k小的數是多少?」
例如令 a = ,查詢格式為q (2 , 5 , 3),數列段a[2..5] = ,第3小的數是5,所以答案是5。
第一行包括乙個正整數n,代表數列的總長度,還有乙個數m,代表有m個查詢。n、m滿足:1≤n≤100 000,1≤m≤5 000。
第二行有n個數,代表數列的元素,所有數都不相同,而且不會超過10^9
接下來有m行,每行三個整數i、j、k,代表一次查詢,i、j、k滿足:1≤i≤j≤n, 1≤k≤j−i+1。
關於這個問題可能已經討論了很多次,但是我用快排的變形還是超時,希望能看更高效的演算法
二、解答
(1)、如果是進行1次查詢的話,可以採用快速排序的變種,時間複雜度為o(n),但是有5000次的話 效率就不太高了。
(2)採用伴隨陣列的方法。排序複雜為o(nlogn),每次查詢的複雜度為o(n).
詳細的講解可參考
採用後伴隨陣列的好處就是,為了對此查詢,「一次排序,多次查詢」!伴隨陣列的實現挺簡單的。
快速排序(求第k小的數)
快排是利用的partition演算法,基本思想是從第乙個數開始,利用partition演算法將這個數在有序序列中的位置找到,這個數的左邊部分都是小於它的數,右邊部分都是大於他的數,然後通過分治的方法對左右兩個區間再進行partition操作,partition演算法 如下 int partition...
求第K大的數
已知 n個數字各不相同,求其中第 k大的數是多少?1 k n 10000 這是一道簡單的試題,我們完全可以套用常用的快速排序模型來解決,即對所有數字進行排序,然後取出第 k大的數字輸出即可,該演算法的時間複雜度為o nlog2n 快速排序的基本思想關鍵在於不斷調整使分治點左邊的數不大於 或不小於 分...
求第k大的數
求第k大的數 給定乙個長度為n 1 n 1,000,000 的無序正整數序列,以及另乙個數k 1 k 1,000,000 關於第k大的數 例如序列中第3大的數是4。輸入第一行兩個正整數m,n。第二行為n個正整數。輸出第k大的數。樣例輸入 copy 6 31 2 3 4 5 6 樣例輸出 copy 4...