题目
要求以最快效率求出一个乱序数组中的第k小的数
例如:{1,6,7,2,3} 第k=3小的数为3
解法
如何找次序?利用partition分界左边是小数右边是大数,那么就能知道partition的次序,再利用二分查找原理,这里的k就相当于target,sequenceOfPivot就相当于mid
public class Solution {
public static int result(int[] arr, int left, int right, int k) {
while(left <= right) {
//小数和大数分界点下标
int indexOfPivot = Util.partition(arr,left,right);
//分界点相应的次序
int sequenceOfPivot = indexOfPivot + 1;
//分界点的值
int pivot = arr[indexOfPivot];
//要找次序k在分界点右边
if(k > sequenceOfPivot) {
left = indexOfPivot + 1;
}
//次序k在分界点左边
else if(k < sequenceOfPivot) {
right = indexOfPivot - 1;
}
//次序k就在分界点处
else return pivot;
}
return -1;
}
}
注意:
- 使用该方法后,原数组的顺序会被打乱
- 这里找的第k小的数实际上找的是原数组被打乱后的数组的第k小的数
- 这个被打乱后的数组的中值次序恰好等于midIndex+1