LeetCode面试题17.14、最小K个数

题目描述

https://leetcode-cn.com/problems/smallest-k-lcci/
在这里插入图片描述

解法

使用快排,然后根据输入的K,我们决定接下来递归哪一边:

class Solution {
    
    
    public int[] smallestK(int[] arr, int k) {
    
    
        if(arr.length==0) return new int[0];
        int []res = new int[k];
        quickSort(arr,0,arr.length-1,k);
        for(int i=0;i<k;i++){
    
    
            res[i] = arr[i];
        }
        return res;

    }
    public void quickSort(int[]num,int start,int end,int k){
    
    
        int base = num[start];
        int i = start,j=end;
        while(i<j){
    
    
            while(i<j && num[j]>base){
    
    
                j--;
            }
            while(i<j && num[i]<base){
    
    
                i++;
            }
            if( num[i]==num[j] && i<j){
    
    
                i++;
            }else{
    
    //使用异或交换两个数,从小到达排序
             if(num[i]!=num[j]){
    
    //必须要判断喔
                    num[i] = num[i]^num[j];
                    num[j] = num[i]^num[j];
                    num[i] = num[i]^num[j];
             }
            
            }
        }
        if(i==k-1)//表示现在我们要找的是左边
            return;//已经找够了k个最小的数了
        else if(i-1>start && i>k-1){
    
    //只需要排左边
            quickSort(num,start,i-1,k);//
        }
        else if(j+1<end && i<k-1) {
    
    //注意这里
            quickSort(num,j+1,end,k);
        }

    }
}

在这里插入图片描述
这里我遇到一个问题:

 if(nums[i]!=nums[j]){
    
    //使用之前注意判断是否已经相同了
                    nums[i] = (nums[i])^(nums[j]);
                    nums[j] = (nums[i])^(nums[j]);
                    nums[i] = (nums[i])^(nums[j]);
                }

这里想装逼的,记得加上判断是否已经相等,如果相等,那你永远得到的是0。

解法上,当然 可以直接用排序,然后取前k个数了。但是快排这样做效率高很多。

猜你喜欢

转载自blog.csdn.net/qq_44861675/article/details/114679522