Leetcode 0215:配列内のK番目に大きい要素

タイトル説明:

ソートされていない配列でk番目に大きい要素を見つけます。これは、k番目の個別の要素ではなく、ソートされた順序でk番目に大きい要素であることに注意してください。

例1:

入力:[3,2,1,5,6,4]およびk = 2
出力:5

例2:

入力:[3,2,3,1,2,4,5,5,6]およびk = 4
出力:4

例3:

入力:s =“ A”、numRows = 1
出力:“ A”

注意:

kは常に有効であり、1≤k≤配列の長さであると想定できます。

時間計算量:O(n)
クイックソートのアイデア:

  1. 与えられた間隔[start、end]で、特定の数xを選択し、左側にx以上の数値を配置し、右側にx未満の数値を配置します。ここで、[start、j]はまたはより大きい間隔です。 xに等しい、[j + 1、end]はx未満の区間です
  2. k番目に大きいjとjの関係を決定します。x以上の場合は区間[start、j]に戻り、そうでない場合は領域[j + 1、end]に戻ります。
class Solution {
    
    
    int[] nums;
    public int findKthLargest(int[] nums, int k) {
    
    
        this.nums = nums;
        return quick(0, nums.length-1, nums.length - k);
    }
    
    private int quick(int start, int end, int k){
    
    
        if(start >= end) return nums[end];
        int mid = start + (end - start)/2;
        int pivot = nums[mid];
        int l = start;
        int r = end;
        while(l <= r){
    
    
            while(l <= r && nums[l] < pivot){
    
    
                l++;
            }
            while(l <= r && nums[r] > pivot){
    
    
                r--;
            }
            if(l <= r){
    
    
                swap(l++, r--);
            }
        }
        
        if(l <= k){
    
    
            return quick(l, end, k);
        }
        if(k <= r){
    
    
            return quick(start, r, k);
        }
        return nums[k];
    }
    
    private void swap(int l, int r){
    
    
        int temp = nums[l];
        nums[l] = nums[r];
        nums[r] = temp;
    }
}

おすすめ

転載: blog.csdn.net/weixin_43946031/article/details/113798956