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