LeetCode 215. Kth Largest Element in an Array

寻找第K大的数字,基本思路和快速排序一样,一趟快速排序后返回的值就是已经排好的数字的个数。

如果返回值需要的个数,那么在之前的一小段中找到最大的值(因为没有像快排那样,前半的也排序)

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
    	k = nums.size() - k + 1;
    	return select(nums,0,nums.size()-1,k);
    }
private:
    int paritition(vector<int>& arr,int left,int right)
    {
    	int pivot = arr[(left+right)/2];
    	while(left <= right)
    	{
    		while(arr[left] < pivot) left++;
    		while(arr[right] > pivot) right--;

    		if(left <= right)
    		{
    			int temp = arr[left];
    			arr[left] = arr[right];
    			arr[right] = temp;
    			left++;
    			right--;
    		}
    	}
    	return left;
    }
    int select(vector<int>& nums,int left,int right,int k)
    {
    	int index = paritition(nums,left,right);
    	int k_index = index - left;

    	if(k == k_index)
    	{
    		int mmax = numeric_limits<int>::min();
    		for(int i = left;i<index;i++)
    			mmax = mmax>nums[i]?mmax:nums[i];
    		return mmax;
    	}
    	if(k < k_index)
    		return select(nums,left,index-1,k);
    	else if(k > k_index)
    		return select(nums,index,right,k-k_index);
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值