题目:寻找第k大
思路:快排 + 二分
快排的思想:每次会找到一个数字的正确位置。
所以根据这个位置和k的大小,我们可以确定,要找的数字在左侧还是右侧,因此,每次只需要查找一半,即二分。
注意:寻找的是第k大,所以快排需要从大到小排。
代码:
import java.util.*;
public class Solution {
public int findKth(int[] a, int n, int K) {
// write code here
return findK(a, 0, n - 1, K);
}
public int findK(int[] nums, int left, int right, int k) {
int temp = nums[left];
int l = left;
int r = right;
while (l < r) {
while (l < r && nums[r] <= temp) {
r --;
}
if (r >= 0) {
nums[l] = nums[r];
}
while (l < r && nums[l] > temp) {
l ++;
}
if (l < nums.length) {
nums[r] = nums[l];
}
}
nums[l] = temp;
if (l == k - 1) {
return nums[l];
}
else if (l > k - 1) {
return findK(nums, left, l - 1, k);
}
else {
return findK(nums, l + 1, right, k);
}
}
}