在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。
說明:這道題最直白的方法就是把陣列排個序,很容易就找到第k大的數字。當然呢直接呼叫庫函式最簡單:你可以假設 k 總是有效的,且 1 ≤ 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...