您的位置:首页 > 其它

Kth Largest Element in an Array

2016-09-12 09:52 218 查看

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.

要找到一个数组中第k大的数需要使用分治策略,可以先在数组中随机找到一个数作为目标数,用与快速排序中类似的做法,把数组中的数分成3个部分并分别存在3个向量中,分别是小于目标数的,等于目标数的和大于目标数的,然后根据k的值,确定第k大的数在哪个部分中,然后再以这个部分的向量和对应修改后的k值递归调用原函数。这样每次递归都能减少问题的规模,直到我们找到第k大的数。

如果按照最坏的情况计算,这个算法的复杂度是O(n^2),而且因为递归调用函数,会浪费大量的内存,我在开始写这个程序时,设定目标数时只是简单地把数组中的第一个元素设为目标数,导致在提交时超了内存。所以随机选取目标数中的随机非常重要,我的做法是利用一个随机数来确定目标数在数组中的下标,这样就可以保证选取的目标数是随机的,然后按照概率计算,每次选取的随机数都是最坏的情况的概率是非常低的,所以按照概率计算这个算法的复杂度是O(n logn)。

以下时源代码:class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int t;
vector<int> l,e,h;
int i=rand()%nums.size();
t=nums[i];
for(int i=0;i<nums.size();i++)
{
if(nums[i]==t) e.push_back(nums[i]);
else if(nums[i]<t) l.push_back(nums[i]);
else h.push_back(nums[i]);
}
if(h.size()>=k)
{
l.clear();
e.clear();
return findKthLargest(h,k);
}
else if(h.size()+e.size()>=k) return t;
else
{
int len1=h.size(),len2=e.size();
h.clear();
e.clear();
return findKthLargest(l,k-len1-len2);
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: