タイトル説明:
ソートされていない配列で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)
クイックソートのアイデア:
- 与えられた間隔[start、end]で、特定の数xを選択し、左側にx以上の数値を配置し、右側にx未満の数値を配置します。ここで、[start、j]はまたはより大きい間隔です。 xに等しい、[j + 1、end]はx未満の区間です
- 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;
}
}