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.

要找到一个数组中第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);
    	}        
    }
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值