第k小的数(二分、partition)

题目

要求以最快效率求出一个乱序数组中的第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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值