在未排序的陣列中找到第 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 ≤ k ≤ 陣列的長度。
(庫函式排序) o(n
long
(n
)o(nlong(n)
o(nlon
g(n)
對於這一道題,最直觀的做法便是使用內建的排序函式排序,而第k大就是從小到大排第n-k+1個元素,他的下標則是n-k
c++ **
class solution
};
堆排序(nlong(n))
對於第k個元素,也可以使用堆排序來做,c++內建了優先佇列,是乙個小根堆,他的堆頂是最大的元素,有兩種寫法
class solution
return q.
top();
}};
寫法2
class solution
return q.
top();
}};
快速選擇o(n)
演算法一內建的sort底層實現也是一種快速排序演算法,類似於快速排序的思想,在每次完成一次劃分之後,可以判斷要尋找的第k大的數也就是陣列座標k-1的與每次的劃分點j分界線的大小,由於每趟快排分界點的數都放在了最終排序後的位置,當[k-1]小於等於j時,此時要尋找的第k大的數字位於j前面的區域,根據二分的思想,可以得知k必定不在j之後的區域,因此只對前面部分排序,反之則直對後面部分排序,弱l=r說明只有乙個元素,便是我們要找的k大的值
時間複雜度分析:o(n)
第一次掃瞄一遍n次,第二趟平均n/2次,第k次平均n/(2^k)次,這一級數和收斂,因此時間複雜度還是o(n)
class solution
intpartition
(vector<
int>
& nums,
int l,
int r,
int k)
if(j>=k-1)
return
partition
(nums,l,j,k)
;//因為第k大對應下標為k-1
else
return
partition
(nums,j+
1,r,k)
;// return 0;}}
;
leetcode 215 快速排序
用快速排序來寫的 這裡一定要明確每個變數的定義,不然很容易出錯 class solution 在 l,r 之間尋找第k大個元素 private int findkthlargest vector nums,int l,int r,int k 返回p使得 0,p 都小於 等於nums 0 p,r 都大...
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...