給定乙個陣列,找出該陣列中第n
大的元素的值。其中,1<=n<=length
。例如,給定乙個陣列a=
,當n=1
時,返回9
。
我拿到這個問題的地中思路就是先排序,然後通過位置索引相應的第n
大的元素。我使用的是o(nlog(n))
級別的排序演算法,所以這種方法的時間複雜度應該也是o(nlog(n))
級別的。
那這個問題有沒更好的解決辦法呢?是有的,我們參考快速排序的思想,可以做到o(n)
級別。在此之前我們先回顧一下快速排序。
我這裡只是簡述以下快速排序的思路。快速排序中最重要的就是partition
操作,就是將我們最左邊的數k
移動到最佳位置(k
左邊的數都小於k
,k
右邊的數都大於k
)
我們通過以下這個例子回顧以下具體操作方式
具體的partition
操作**
template
<
typename t>
int__partition
(t arr,
int l,
int r)
} std::
swap
(arr[l]
, arr[j]);
return j;
}
上面**是最基礎的操作。
我們通過快速排序中的思想,可以很快地解決這個問題
template
<
typename t>
int__partition
(t arr,
int l,
int r)
} std::
swap
(arr[l]
, arr[j]);
return j;
}template
<
typename t>
int__selection
(t arr,
const
int& l,
const
int& r,
const
int& k)
template
<
typename t>
intselection
(t arr,
const
int& n,
const
int& k)
我們回顧上面的做法,不難發現,我們每次對問題的規模縮小一半,演算法複雜度為
n + n/2 + n/4 + ... + 1 = 2n
,即為o(2n)
。
尋找陣列中的第K大的元素
遇到了乙個很簡單而有意思的問題,可以看出不同的演算法策略對這個問題求解的優化過程。問題 尋找陣列中的第k大的元素。最簡單的想法是直接進行排序,演算法複雜度是o n logn 這麼做很明顯比較低效率,因為不要求別的資訊只要計算出第k大的元素。當然,如果在某種情況下需要頻繁訪問第k大的元素就可以先進行一...
經典演算法題 尋找陣列中第k大的元素
問題描述 在陣列中找到第 k 大的元素。要求時間複雜度為o n 空間複雜度為o 1 分析 此類問題為排序問題,主要難點在於時間複雜度為o n 採用快速排序演算法進行排序 function quicksort nums,k,start,end var left start,right end var ...
尋找陣列中的第K大元素
一 簡述 使用資料結構堆,實現查詢陣列中的第k大元素。流程如下 陣列內容堆化 因為是查詢第k大,所以使用大根堆 依次取出並刪除堆的根節點 將剩餘元素堆化 取到第k個即為目標元素。二 實現 include include using namespace std intfindkth vector in...