LeetCode-215數組中的第K個最大元素-快排-cpp

LeetCode-day45-數組中的第K個最大元素-快排-cpp

題目回顧

傳送門

在未排序的數組中找到第 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(nlog(n))O(nlog(n))
空間複雜度O(N)O(N)
執行用時:28ms28 ms

簡單粗暴的排序法
先排序,然後直接取第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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章