題目回顧
在未排序的數組中找到第 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 ≤ 數組的長度。
題解
簡單粗暴的排序法
先排序,然後直接取第k位置就可以
冒泡
類似於冒泡排序的思路,從小往大冒泡,冒k次之後就得到第k大的數了
小根堆
維護一個小根堆,遍歷數組,如果當前元素大於根,則加入堆中;如果加入後堆的元素數量多於k,則彈出根元素。 遍歷一遍之後,根就是第k大的元素。
類似快排的劃分思路
先任取一個數,把比它大的數移動到它的左邊,比它小的數移動到它的右邊。移動完成一輪後,看該數的下標(從0計數),如果剛好爲k-1則它就是第k大的數,如果小於k-1,說明第k大的數在它右邊,如果大於k-1則說明第k大的數在它左邊,取左邊或者右邊繼續進行移動,直到找到。
此處只用了快排
cpp
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
static bool ismax(const int &a,const int &b){
return a>b;
}
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(),nums.end(),ismax);
return nums[k-1];
}
};
int main(){
Solution sol=Solution();
vector<int> vec={1,2,3,4,165,24};
//result repect is : 24
cout<<sol.findKthLargest(vec,2);
return 0;
}