topk-快排思想

傻逼才用Arrays.sort,用了就去当保安吧

思想:快排每次都会左右分区,保证选到的元素位置不再变。使用这个思想,下标如果刚好对上,那就说明找到了。

class Solution {
    public int findKthLargest(int[] nums, int k) {
        //按照正序来 di
        int n = nums.length;
        int x = n-k;
        //开始快排
        int r = n-1;
        int l = 0;
        for(;;){
            //表示选了一次 需要这个返回下标 
            int c = partition(nums,l,r);
            if(c == x) return nums[x];
            else{//有个区间缩小的比较
                if(c > x){
                    r = c-1;
                }else{
                    l = c+1;
                }
            }
        }
    }
    //等于加了个范围 只管[l,r]里的快排
    private int partition(int[] nums,int l,int r){
        //先用l试试
        int j = l;
        //返回c的最终下标
        for(int i = l+1;i<=r;i++){
            if(nums[i] < nums[l]){
                j++;
                swap(nums,j,i);
            }
        }
        swap(nums,l,j);
        return j;
    }
    private void swap(int[] nums,int i,int j){
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }
}

posted @ 2021-09-15 12:23  常熟阿诺  阅读(98)  评论(0编辑  收藏  举报