LeetCode 215数组中的第K个最大元素

LeetCode 215数组中的第K个最大元素

  • 题目简述:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

  • 输入:[3,2,1,5,6,4] 和 k = 2 输出:5

    输入:[3,2,3,1,2,4,5,5,6] 和 k = 4 输出:4

  • 思路一:利用STL大根堆维护数组元素,将前k-1个元素从大根堆中弹出,栈顶元素就是K大值

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        priority_queue<int> q;
        for(auto x : nums) q.push(x);
        while(--k) q.pop();
        return q.top();
    }
};
  • 思路二:快排分治
class Solution {
public:
    int select(vector<int>& nums, int l, int r, int k)
    {
        if(l == r) return nums[l];//递归出口
        int x = nums[l+r >> 1];//分界点,分为左右区间
        int i = l - 1, j = r + 1;//指针起始位置
        while(i < j)//从大到小排序
        {
            //找到 左区间中比分界点小的数 和 右区间中比分界点大的数 交换
            while(nums[++i] > x);
            while(nums[--j] < x);
            if(i < j) swap(nums[i], nums[j]);
        }
        int s = j - l + 1;//计算左区间个数
        if(k > s) return select(nums,j+1,r,k-s);//递归右区间
        return select(nums,l,j,k);//递归左区间
    }

    int findKthLargest(vector<int>& nums, int k) {
        int n = nums.size();
        return select(nums, 0, n - 1, k);
    }
};

你可能感兴趣的:(LeetCode)