Leetcode_215_Kth Largest Element in an Array

本文介绍了一种利用快速排序思想来高效寻找无序数组中第K大元素的方法,并提供了具体的实现代码。

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

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.

题目大意:
给一个无序的数组,要求找到第k大的数字。
思路:
既然找第k大个元素的位置,就是找到第(length-k)个元素,这里可以使用快速排序的思想,快速排序特性是每一趟结束之后可以确定一个元素的位置。
1. 取一个基准p(一般是数组的第一个元素)。
2. 进行快速排序一趟之后可以确定这个基准的最终位置 loc。
3. 如果loc大于(length-k)那就在左边找,否则就在右边找。

   public int findKthLargest(int[] nums, int k) {
        if(nums.length==0){
            return 0;
        }
        if(k<0 || k>nums.length){
            return -1;
        }
        //上面排除了错误的例子。下面正式开始。
        int left=0;
        int right=nums.length-1;
        int taget=nums.length-k;
        int i=0;
        while (left<=right){//如果左边小于右边
            i=quickSort(nums,left,right);  //找到基准的最终的位置
            if(i==taget){//如果等于target的话就跳出
                break;
            }else if(i<taget){//如果i<target的话就在右边找。
                left=i+1;
            }else {
                right=i-1;
            }
        }
        return nums[i];//nums[i]就是我们要找的元素。
    }
    public int quickSort(int []nums,int left,int right){//返回值是 基准的 最终位置loc。
        int tmp;
        int i=left;
        int j=right;
        tmp=nums[left];
        while (i!=j){
            while (j>i&&nums[j]>tmp) --j;
            if(i<j){
                nums[i]=nums[j];
                ++i;
            }
            while (i<j && nums[i]<tmp) ++i;
            if(i<j){
                nums[j]=nums[i];
                --j;
            }
        }
        nums[i]=tmp;

        return i;

    }

分析:使用快速排序的思路进行最大值的挑选速度很快。还可以用其他的方法,归并树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值