二分查找算法

时间复杂度O(log n):表示计算得时间为n得一半

下面通过一个例子来解析一下二分算法(个人理解):

在给定一个数组与一个目标值target,若数组中有等于target得值,返回对应得下标,没有对应得值则返回应该插入得下标位置,数组是递增得,要求时间复杂度为O(log n):

  • nums 为 无重复元素 的 升序 排列数组

编写对应代码:

因为时间复杂度需要O(log n) ,而二分算法刚好满足这个时间复杂度,因为每次搜索只查询数组得一半。

public class Algorithm {
    public int binarySearch(int[]nums, int target) {
        int left = 0;    //数组最左边对应得下标
        int right = nums.length - 1;   //数组最右边对应得下标
        while(left <= right) {         //当left > right时结束循环
            int mid = left + (right - left) / 2;   //获得数组得中间值
            if(nums[mid] == target) {
                return mid;
            } else if(nums[mid] > target) {   //如果中间下标得值大于目标值,,因为数组是递增的,右边部分所有的值会比中间值大,那么说明目标值在中间值得左边,那么就将right = mid - 1;
               right = mid - 1;
            } else if(nums[mid] < target) {  //同理,中间值小于目标值,因为递增数组,中间值左边的所有数值都会小于目标值,那么目标值就在中间值的右边部分,那么将left的下标变为mid + 1;
               left = mid + 1;
            }
        }
        //若没有等于的目标值,那么返回左边的值
        return left;
    }
}

图像表示:

星号★:表示方法里里面代码执行的顺序

圆形⭕:表示循环里面执行的步骤

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值