您的位置:首页 > 其它

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

2017-09-18 10:30 561 查看

描述

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答案
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode