LeetCode 215. Kth Largest Element in an Array

189 篇文章 0 订阅
162 篇文章 0 订阅

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.

Example 1:

Input: [3,2,1,5,6,4]

and k = 2 Output: 5

Example 2:

Input: [3,2,3,1,2,4,5,5,6] and k = 4

Output: 4

Note:
You may assume k is always valid, 1 ≤ k ≤ array's length.

 

 

代码:

class Solution {
    public int findKthLargest(int[] nums, int k) {
        if(k<1||k>nums.length)
            return -1;
        Arrays.sort(nums);
        return nums[nums.length-k];
    }
}

 

 

方法二:

1、通过三路快排查找元素在排序后数组中的位置

pivot=nums[l]

可以将数组分为<pivot、==pivot、>pivot三部分。

lt是小于pivot的索引值,gt是大于pivot的索引值

nums[0,lt]保存的是<pivot的值,[lt+1,gt-1]保存的是==pivot的值,[gt,r]保存的是>pivot的值

当nums[i]<pivot,保存pivot的第一个索引位置的值与当前遍历到的i的位置的值进行交换,并且i++(说明继续扫描)、lt++(说明多了一个0元素),交换后lt_1的位置为0,i的位置为pivot

当nums[i]==pivot,将nums[i]纳入保存pivot的集合,此时只需要i++(继续向后遍历)就说明保存pivot的集合多了一个元素

当nums[i]>pivot,将i与--gt的位置进行交换,此时就将大于pivot的元素放在了数组末尾,同时前面的--gt操作,也让保存>pivot的数组集合扩大了,说明多了一个元素

2、判断该位置index与目标位置k的关系。

如果k==index,返回nums[k]

如果k<index,说明目标k在所查得的目标索引k的左边,继续从l~index-1中进行查找

如果k>index,说明目标k在目标索引的右边,继续从index+1~r中进行查找

class Solution {
    private int res=-1;
    public int findKthLargest(int[] nums, int k) {
        if(nums.length<=0||k>nums.length)return -1;
        findKthLargest(nums,nums.length-k,0,nums.length-1);
        return res;
    }
    
    //求nums[l,r]中第k大的数字
    private void findKthLargest(int[]nums,int k,int l,int r){
        int index=partion(nums,l,r);
        if(index==k){
            res=nums[index];
            return;
        }else if(index<k){
            findKthLargest(nums,k,index+1,r);
        }else{
            findKthLargest(nums,k,l,index-1);
        }
    }
    
    
    //求nums[l]如果按照顺序排完nums数组后所在的位置
    private int partion(int[]nums,int l,int r){
        int lt=l-1;
        int gt=r+1;
        int pivot=nums[l];
        
        //保证循环过程中nums[l,lt]保存的是<pivot的数字
        //[lt+1,i]保存的是等于pivot的数字
        //[gt,r]保存的是大于pivot的数字
        for(int i=l;i<gt; ){
            if(nums[i]<pivot){
                swap(nums,++lt,i++);
            }else if(nums[i]==pivot){
                i++;
            }else{//nums[i]>pivot
                if(nums[gt-1]!=nums[i]){
                    swap(nums,--gt,i);
                }else{
                    gt--;
                }
                
            }
        }
        
        return lt+1;
    }
    
    private void swap(int[] nums,int l,int r){
        int temp=nums[l];
        nums[l]=nums[r];
        nums[r]=temp;
    }
}

 

参考资料:

https://leetcode.com/problems/kth-largest-element-in-an-array/discuss/60294/Solution-explained

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值