Leetcode刷题详解——二分查找

1. 题目链接:704. 二分查找

2. 题目描述:

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

提示:

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。

3. 算法思路:

  1. 初始化左指针left为0,右指针right为数组长度减1。

  2. 进行循环,直到左指针left大于右指针right

    a. 计算中间位置mid,即(left + right) / 2

    b. 如果中间位置的元素等于目标元素,返回mid

    c. 如果中间位置的元素大于目标元素,说明目标元素可能在左半部分,将右指针right更新为mid - 1

    d. 如果中间位置的元素小于目标元素,说明目标元素可能在右半部分,将左指针left更新为mid + 1

  3. 如果循环结束仍未找到目标元素,返回-1。

4. 算法流程:

  • 定义leftright指针,分别指向数组的左右区间
  • 找到待查找区间的中间点mid,找到之后分三种情况讨论:
    • arr[mid]==target,说明正好找到,返回mid的值
    • arr[mid]>target,说明[mid,right]这段区间都是大于target的,因此舍去右边区间,在左边[left,mid-1]的区间继续查找,即让right=mid-1,然后重复2过程;
    • arr[mid]<target,说明[left,mid]这段区间的值都小于target的,因此舍去左边区间,在右边[mid+1,right]区间继续继续查找,即让left=mid+1,然后重复2过程
  • leftright·错开时,说明整个区间都没有这个数,返回-1

请添加图片描述

5. C++代码实现:

class Solution {
public:
    int search(vector<int>& nums, int target) 
    {
        //初始化lef和right指针
        int left=0,right=nums.size()-1;
        //两个指针相交时,当前元素还未判断,因此需要取等号
        while(left<=right)
        {
            //先找到区间的中间元素
            int mid=left+(right-left)/2;
            //分三种情况讨论
            if(nums[mid]==target) return mid;
            else if(nums[mid]>target) right=mid-1;
            else left=mid+1;
        }
        //如果程序走到这里,说明没有找到目标值,返回-1
        return -1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值