第K大元素

2021-09-03 01:15:03 字數 994 閱讀 3487

在陣列中找到第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.使用選擇排序進...