LeetCode 215 陣列中的第K個最大元素

2021-10-14 00:05:38 字數 1148 閱讀 1098

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。

說明:

你可以假設 k 總是有效的,且 1 ≤ k ≤ 陣列的長度。

這道題最直白的方法就是把陣列排個序,很容易就找到第k大的數字。當然呢直接呼叫庫函式最簡單:sort(nums.begin(), nums.end(), greater());,但是畢竟這道題這樣太簡單了,還是手寫乙個快排吧。在快排時要注意一點,因為快排本質上是分治,類似於歸併排序的二分,這裡雖然每次也是二分,但是並不是均分的二分,因此整個過程是一棵二叉樹。但是當陣列趨近於有序時,就會導致當前選擇基準值的右方已經是比基準值大的值,這樣會導致二叉樹只有有子樹,此時退化為了鍊錶,導致時間複雜度到達最大——o(n2)。為了打亂有序陣列,在開始加入乙個隨機選取的步驟:隨機選取乙個陣列中的值和基準值交換。這樣便使得時間複雜度趨近於o(nlogn)。經測試,此題不加隨機時,耗費時間為200ms,加隨機後節省了近十倍時間,達到了20ms。

class

solution

//交換vector的i和j位置的兩個值

void

swap2no

(vector<

int>

& v,

int i,

int j)

//快速排序

void

quicksort

(vector<

int>

& v,

int low,

int high)

//i=j時迴圈結束,把基準值放到i和j相交的地方

v[low]

= v[i]

; v[j]

= tmp;

quicksort

(v, low, i -1)

;//繼續執行基準值左半邊

quicksort

(v, i +

1, high)

;//右半邊}}

;

LeetCode 215 陣列中的第K個最大元素

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 說明 你可以假設 k 總是有效的,且 1...

LeetCode 215 陣列中的第K個最大元素

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 說明 你可以假設 k 總是有效的,且 1...

Leetcode215 陣列中的第K個最大元素

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 說明 你可以假設 k 總是有效的,且 1...