二分查找-Leetcode

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

class Solution {
public:
    int search(vector<int>& nums, int target) {

    int left = 0;
    int right = nums.size()-1;//sizeof(nums) 不适用于 std::vector,应该使用 nums.size() 来获取向量的大小
    while(left<=right){//应该使用 left <= right 因为二分查找需要包括 right 边界
        int middle = left+(right-left)/2;//计算中间索引时,如果 left 和 right 的值很大,直接相加除以2可能会导致整数溢出
        if(target > nums[middle]){
            left = middle+1;
    }
        else if(target < nums[middle]){
            right = middle-1;
        }
        else {
            return middle;
        }
      
    }
     return -1;
    }

};

总结:

  1. 初始化两个指针 left 和 right,分别指向数组的起始和结束位置。
  2. 使用 while 循环,只要 left 小于或等于 right,就继续查找。
  3. 在每次迭代中,计算中间索引 middle,使用 left 和 right 的平均值来避免整数溢出。
  4. 比较 target 和 nums[middle] 的值:
    • 如果 target 大于 nums[middle],则将 left 指针移动到 middle + 1,即在数组的右半部分继续查找。
    • 如果 target 小于 nums[middle],则将 right 指针移动到 middle - 1,即在数组的左半部分继续查找。
    • 如果 target 等于 nums[middle],则返回 middle,表示找到了目标值。
  5. 如果循环结束都没有找到目标值,left 将大于 right,此时返回 -1 表示未找到目标值

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值