C++实现二分法详解

本文详细介绍了二分法在查找目标值、查找目标值左右边界的应用。针对不同的初始区间,讨论了区间收缩的逻辑,确保在有序序列中正确找到目标值的位置或边界。
摘要由CSDN通过智能技术生成

二分法是在一个排好序的序列(数组,链表等)中,不断收缩区间来进行目标值查找的一种算法,下面我们就来探究二分法使用的一些细节,以及常用的场景:

  1. 寻找一个数;
  2. 寻找左侧边界;
  3. 寻找右侧边界。

一、二分法的通用框架

int binarySearch(vector<int>& nums, int target){
    int left=0, right=nums.size();
    while(left < right)
    {
        int mid=(left+right)/2;
        if(nums[mid] == target){
            // 条件一:中间的值与目标值相同
        }
        else if(nums[mid] > target){
            // 条件二:中间的值大于目标值
        }
        else if(nums[mid] < target){
            // 条件三:中间的值小于目标值
        }
    }
    return -1;    
}

首先,我们先来分析一下右边界 right 的初始值:

  1. 当 right=nums.size() 时,初始化的区间就变成了 [0,right−1],即 [0,right);
  2. 当right=nums.size()-1 时,初始化的区间就变成了 [0,right]。

在第一种情况下,当 nums[mid] > target 时,需要将区间向左收缩,即 right&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值