class Solution {
//这一题使用的思想是基于快排和二分法的,先通过快排找到一个数的位置index,将它与本length — k做对比,如果index > length - k那么我们要找的数一定在index之前所以甩掉右半部分,如果index= length - k直接返回本位置,如果index < length - k说明本位置在index的右边甩掉左部分
public int findKthLargest(int[] nums, int k) {
//首先准备好参数进行一次快排操作
int start = 0;
int end = nums.length - 1;
int index = fastSort(nums,start,end);
//观察快排结果二分查找
int target = nums.length - k;
while(target != index){
if(target > index){
start = index + 1;
}else{
end = index - 1;
}
index = fastSort(nums,start,end);
}
//返回结果
return nums[target];
}
//快排
public int fastSort(int[] array,int start,int end){
//随机在start到end的范围内生成一个随机数作为排序的位置
int random = new Random().nextInt(end - start + 1) + start;
//交换该位置和最后一个位置的值
swap(array,random,end);
//确定后指针的位置
int small = start - 1;
//开始前进前指针寻找一个小于num[end]的数交换位置直到末尾
for(int i = start;i < end;i++){
if(array[i] < array[end]){
small++;
swap(array,small,i);
}
}
//交换small和end的位置
small++;
swap(array,small,end);
//返回的small就是现在排好序的位置
return small;
}
//交换位置
public void swap(int[] array,int index1,int index2){
if(index1 != index2){
array[index1] = array[index1] ^ array[index2];
array[index2] = array[index1] ^ array[index2];
array[index1] = array[index1] ^ array[index2];
}
}
}
寻找数组中第k大的数java实现
最新推荐文章于 2024-10-10 18:18:05 发布