数组
力扣T215findKthLargest
找第k个最大数
public class T215findKthLargest {
static Random random = new Random();
public static int findKthLargest(int[] nums, int k) {
//方法一:快排
int len = nums.length;
//找标志位的, 如数组长度为5,k为2,第2大的索引就是5-2=3
int res = quickSort(nums, 0, len - 1, len - k);
return res;
}
private static int quickSort(int[] nums, int l, int r, int target) {
int pos = randomQuickSort(nums, l, r);
//递归
if (pos == target) {
return nums[target];
}else if(pos < target){
//左边舍弃
return quickSort(nums, pos + 1, r, target);
}else {
return quickSort(nums, l, pos-1, target);
}
}
private static int randomQuickSort(int[] nums, int l, int r) {
//nextInt里面是随机数种子,不包含最后一个数
int ran = random.nextInt(r - l +1) + l;
//***
swap(nums, ran, r);
//排序
//定义两个指针,ptr2往后遍历,遇到比ran位置元素小的,就跳到ptr1那里
int ptr1 = l, ptr2 = l;
while (ptr2 < r){
if (nums[ptr2] < nums[r]){
swap(nums, ptr1, ptr2);
ptr1++;
ptr2++;
}else {
ptr2++;
}
}
//****最大的错误是没有处理好 ran位置的元素,如果我这种思路,是需要 最后解决ran的最终位置的
//****不妨从一开始就把 ran位置的元素和最r的元素调换一下,最后再把ran掉到ptr1的位置。
//***
swap(nums, r, ptr1);
return ptr1;
}
private static void swap(int[] nums, int ptr1, int ptr2) {
int tmp;
tmp = nums[ptr1];
nums[ptr1] = nums[ptr2];
nums[ptr2] = tmp;
}
public static void main(String[] args) {
int[] nums = {3,2,1,5,6,4};
int res = findKthLargest(nums, 3);
System.out.println(res);
}
}