记录力扣学习(数组中第k大的元素)

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

class Solution {
    public int findKthLargest(int[] nums, int k) {
            int target=nums.length-k;
            int l=0,r=nums.length-1;
            while(true) {
                int index = partion(l, r, nums);
                if (index == target) {
                    return nums[index];
                }else if(index<target)l=index+1;
                else r=index-1;
            }
    }//[3,2,1,4,5,6]  2
    int partion(int l,int r,int[] nums)
    {//走一轮快排,遇到小的交换,
        int j=l,p=nums[l];
        for (int i = l+1; i <=r ; i++) {
            if(p>nums[i])
            {
                j++;
                swap(nums, i, j);
            }
        }
        swap(nums, l, j);//最后把确定temp的位置返回
        return j;
    }
    void swap(int []nums,int x1,int x2)
    {
        int t=nums[x1];
        nums[x1]=nums[x2];
        nums[x2]=t;
    }
}

这题没有限制时间复杂度,很明显直接sort(),再nums[n-k]就完事,时间复杂度nlogn,非常快,但想想,我觉得这题应该考的是一轮排序,在排序中,什么排序能在一轮位置确定该元素的最终位置,我的话想到两种,选择,快排。

1 、选择

如果找升序,那么就比n-k轮,最好是O(n),最坏是O(n^2)

2、快排

快排操作性就比较大,一轮排序最终确定位置的是temp,可以按二分的方式
把边界缩小,官方解也采用了二分后取随机值的方式让这种方法尽可能对付有序这种情况,所以最好是O(n)最坏应该是O(nlogn)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值