leetcode第215题

本文探讨了LeetCode第215题的两种解决方案,分别是使用选择排序来寻找第k大的数字,以及通过分治策略实现快速排序来定位倒数第k个数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

leetcode第215题

方法一:选择排序

选择排序,第k轮可以求得第k大的数字

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        //选择排序,第k轮可以求得第k大的数字
        int n=nums.size();
        for(int i=0;i<k;i++)
        {
            int maxIndex=i;
            for(int j=i+1;j<n;j++)
            {
                if(nums[j]>nums[maxIndex])
                    maxIndex=j;
            }
            int temp=nums[i];
            nums[i]=nums[maxIndex];
            nums[maxIndex]=temp;
        }
        return nums[k-1];
    }
};

方法二:分治

快速排序,每次确定一个数的位置,如果倒数第k个数的位置确定了,那就找到了倒数第k个数

class Solution {
public:
    //比flag大的放左边,比flag小的放右边,返回flag的坐标
    int findFlag(vector<int>& nums,int start,int end)
    {
        if(end<=start)
            return start;
        int flag=nums[start];
        int left=start;
        int right=end;
        while(left<right)
        {
            //在右边找一个比flag小的数字
            while(left<right&&nums[right]>flag)
                right--;
            //把右边那个比flag小的数字放到左边的空位上
            nums[left]=nums[right];
            //在左边找一个比flag大的数字
            while(left<right&&nums[left]<=flag)
                left++;
            //把左边那个比flag小的数字放到右边的空位上  
            nums[right]=nums[left];
        }
        //最后把flag放在left那个位置上
        nums[left]=flag;
        return left;
    }
    //排序,如果倒数第k个数被排到了那就结束
    void quickSort(vector<int>& nums,int start,int end,int k)
    {
        if(start>=end)
            return ;
        int n=nums.size();
        int flag=findFlag(nums,start,end);
        if(flag==n-k)
            return;
        //在左边排序
        quickSort(nums,start,flag-1,k);
        quickSort(nums,flag+1,end,k);
        
        
    }
    int findKthLargest(vector<int>& nums, int k) {
       quickSort(nums,0,nums.size()-1,k);
       return nums[nums.size()-k];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值