在陣列中找到第k大的元素。
給出陣列[9,3,2,4,8]
,第三大的元素是4
給出陣列[1,2,3,4,5]
,第一大的元素是5
,第二大的元素是4
,第三大的元素是3
,以此類推
要求時間複雜度為o(n),空間複雜度為o(1)
如果不考慮時間複雜度和空間複雜度,這道題目有很多種方法,利用一種排序演算法將陣列倒敘排序,第k個數就是第k大元素。
題目的重點在於返回第k大元素,而其他元素並不關心。如果要返回第k大元素,必然要先找到比k大的k-1個數,這k-1個數的順序也並不用關心。如果我們使用冒泡、選擇等常規排序,需要從最大的開始找起,那麼時間複雜度就是o(n * k),當k較大時,時間複雜度太高。
快速排序演算法的特點就在於經過一次遍歷,可以分別找到比某個元素小的數和大的數,如果比這個元素大的數的個數恰好是k-1,那麼這個數就正是我們要找的數。假如經過一次遍歷之後,元素a左邊的元素均大於a,右邊的元素均小於a,a的陣列下標是index,若index+1=k,那麼a就是第k大元素;若index+1>k,那麼第k大元素就在陣列的0~index-1中,此時問題就變為了在陣列的0~index-1中尋找第k大元素,繼續迴圈遍歷操作直到存在某個index使index+1=k為止;若index+1public
intkthlargestelement
(int n,
int[
] nums)
}swap
(nums, high,
++index);if
(index +
1== n)
else
if(index +
1> n)
else
}return-1
;}private
void
swap
(int
nums,
int a,
int b)
第k大元素
在陣列中找到第k大的元素 最先想到的是簡單排序,但是簡單排序超時,於是想到改造快排,快排的思想是每次確定乙個元素在陣列中的下標,如果確定的下標為k那該元素為k大,若下標大於k,第k大在改下標之前.class solution public int pat int nums,int start,int...
5 第k大元素
2017.9.14 昨天做了一整天的題。首先使用了氣泡排序,我知道會超時。但還是做了一遍,心想複習一下舊的知識也是極好的。於是,果然超時了。但是毫不氣餒。想,要不用快速排序試一試。但是自作聰明的以為這題一定是在考堆排序。然而堆排序是我最不會的排序方式,但還是下定決心開始學習。好不容易學會了之後,果然...
5 第k大元素
題目描述 在陣列中找到第k大的元素 樣例 給出陣列 9,3,2,4,8 第三大的元素是 4 給出陣列 1,2,3,4,5 第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此類推 挑戰 要求時間複雜度為o n 空間複雜度為o 1 注意事項 你可以交換陣列中的元素的位置 1.使用選擇排序進...