LeetCode題解系列--215. Kth Largest Element in an Array

描述

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.

For example,
Given [3,2,1,5,6,4] and k = 2, return 5.

Note:
You may assume k is always valid, 1 ≤ k ≤ array’s length.

Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.

難度:medium

思路

這次所選擇的是一道可以採用分治算法的題目,實際上是採用了課上老師所講的算法。
在數組中隨機選一個數稱爲flag,然後將原數組分爲三個部分,大於flag部分,小於flag部分,等於flag部分。然後通過這三個數組的大小,推斷第k大的數屬於哪個數組,進行遞歸調用。具體的如圖:
這裏寫圖片描述

整體來說算法還是比較簡單,但是這個算法的時間複雜度呢?
從最壞情況考慮,是比較糟糕的,大概是O(n^2),不過實際做起來,這種情況發生的概率很低。

答案

#include <time.h>

class Solution {

public:
    int findKthLargest(vector<int>& nums, int k) {
        // get random number
        srand(time(NULL));
        int index = rand() % nums.size();
        int flag = nums[index];

        vector<int> smaller, equal, bigger;

        // group into three number
        for (int i = 0; i < nums.size(); ++i) {
            if (nums[i] < flag) {
                smaller.push_back(nums[i]);
            } else if (nums[i] == flag) {
                equal.push_back(nums[i]);
            } else {
                bigger.push_back(nums[i]);
            }
        }

        if (bigger.size() >= k) {
            return findKthLargest(bigger, k);
        } else if (bigger.size() + equal.size() < k) {
            return findKthLargest(smaller, k - bigger.size() - equal.size());
        } else {
            return flag;
        }
    }
};

點擊這裏查看更多我的leetcode答案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章