二分搜索算法解题步骤,吐血整理

我的个人网站:http://hardyfish.top/

基本介绍

二分搜索(折半搜索)是一种在有序数组中查找某一特定元素的搜索算法。从定义可知,运用二分搜索的前提是数组必须是排好序的。另外,输入并不一定是数组,也有可能是给定一个区间的起始和终止的位置。

他的时间复杂度是 O(lgn),非常高效。

特点

他的缺点要求待查找的数组或者区间是排好序的。

对数组进行动态的删除和插入操作并完成查找,平均复杂度会变为 O(n)。

因此,当输入的数组或者区间是排好序的,同时又不会经常变动,而要求从里面找出一个满足条件的元素的时候,二分搜索就是最好的选择。

解题思路

二分搜索一般化的解题思路如下。

  • 从已经排好序的数组或区间中取出中间位置的元素,判断该元素是否满足要搜索的条件,如果满足,停止搜索,程序结束。

  • 如果正中间的元素不满足条件,则从它两边的区域进行搜索。由于数组是排好序的,可以利用排除法,确定接下来应该从这两个区间中的哪一个去搜索。

  • 通过判断,如果发现真正要找的元素在左半区间的话,就继续在左半区间里进行二分搜索。反之,就在右半区间里进行二分搜索。

二分查找的解题框架

int binarySearch(int[] nums, int target) {
   
    int left = 0, right = ...;

    while(...) {
   
    	//计算 mid 时需要技巧防止溢出,建议写成: mid = left + (right - left) / 2
        int mid = (right + left) / 2;
        if (nums[mid] == target) {
   
            ...
        } else if (nums[mid] < target) {
   
            left = ...
        } else if (nums[mid] > target) {
   
            right = ...
        }
    }
    return ...;
}

常见解法

递归解法

例题:假设我们要从一个排好序的数组里 {1, 3, 4, 6, 7, 8, 10, 13, 14} 查看一下数字 7 是否在里面,如果在,返回它的下标,否则返回 -1。

递归写法的代码模板如下。

// 二分搜索函数的定义里,除了要指定数组 nums 和目标查找数 target 之外,还要指定查找区间的起点和终点位置,分别用 low 和 high 去表示。
int binarySearch(int[] nums, int target, int low, int high) {
   
        // 为了避免无限循环,先判断,如果起点位置大于终点位置,表明这是一个非法的区间,已经尝试了所有的搜索区间还是没能找到结果,返回 -1。 

	if (low > high) {
   
        return -1;
    }
    // 取正中间那个数的下标 middle。
    int middle = low + (high - low) / 2;
    
    // 判断一下正中间的那个数是不是要找的目标数 target,是,就返回下标 middle。    
    if (nums[middle] == target) {
   
        return middle;
    }
    
    // 如果发现目标数在左边,就递归地从左半边进行二分搜索。
    if (target < nums[middle]) {
   
        return binarySearch(nums, target, low, middle - 1);<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值