topk-快排思想
傻逼才用Arrays.sort,用了就去当保安吧
思想:快排每次都会左右分区,保证选到的元素位置不再变。使用这个思想,下标如果刚好对上,那就说明找到了。
class Solution {
public int findKthLargest(int[] nums, int k) {
//按照正序来 di
int n = nums.length;
int x = n-k;
//开始快排
int r = n-1;
int l = 0;
for(;;){
//表示选了一次 需要这个返回下标
int c = partition(nums,l,r);
if(c == x) return nums[x];
else{//有个区间缩小的比较
if(c > x){
r = c-1;
}else{
l = c+1;
}
}
}
}
//等于加了个范围 只管[l,r]里的快排
private int partition(int[] nums,int l,int r){
//先用l试试
int j = l;
//返回c的最终下标
for(int i = l+1;i<=r;i++){
if(nums[i] < nums[l]){
j++;
swap(nums,j,i);
}
}
swap(nums,l,j);
return j;
}
private void swap(int[] nums,int i,int j){
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}