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答案

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值