Leetcode704. 二分查找

二分查找算法详解与实现
本文介绍了704题的二分查找算法解决方案。通过简单的二分查找模板,展示了如何在有序数组中查找目标值。代码中定义了一个名为`search`的函数,该函数在数组`nums`中查找目标`target`,返回目标值的索引或-1表示未找到。

Every day a leetcode

题目来源:704. 二分查找

解法1:二分查找

简单的二分查找模板。

代码:

int search(int* nums, int numsSize, int target){
    int left=0;
    int right=numsSize-1;
    int mid;
    while(left<=right)
    {
        mid=(left+right)/2;
        if(nums[mid]>target) right=mid-1;
        else if(nums[mid]<target) left=mid+1;
        else return mid;
    }
    return -1;
}

结果:
在这里插入图片描述

Leetcode 704题是二分查找的典型题目。二分查找借助数组有序的特点,进行折半查找。 从解题思路来看,由于数组有序,所以可以通过不断缩小查找范围来找到目标值。具体做法是设置 `low = 0`,`heigh = 数组长度 - 1`,`mid = (low + heigh) / 2`。当 `nums[mid] = target` 时,返回 `mid`;当 `nums[mid] < target` 时,所要查找的值在 `mid` 的右边,更新 `low = mid + 1`;当 `nums[mid] > target` 时,所要查找的值在 `mid` 的左边,更新 `heigh = mid - 1`。代码实现如下: ```c int search(int* nums, int numsSize, int target){ int low = 0; int heigh = numsSize - 1; int mid; while(heigh >= low){ mid = (low + heigh) / 2; if(nums[mid] == target){ return mid; } if(nums[mid] < target){ low = mid + 1; } else { heigh = mid - 1; } } return -1; } ``` 从二分查找的整体过程分析,首先要设定左右指针,找出中间位置,并判断该位置值是否等于 `target`。若 `nums[mid] == target` 则返回该位置下标;若 `nums[mid] > target` 则右侧指针移到中间;若 `nums[mid] < target` 则左侧指针移到中间。其时间复杂度为 $O(logN)$ [^2][^3]。 不过二分查找涉及很多边界条件,逻辑虽然简单,但容易出错。例如到底是 `while(left < right)` 还是 `while(left <= right)`,到底是 `right = middle` 还是 `right = middle - 1`,这都需要根据区间的定义来确定 [^5]。 此外,还有不朴素二分查找,即二分查找的循环里左右指针的行为为 `left = mid + 1,right = mid` 或者 `left = mid,right = mid - 1` 这两种情况,需要专门的模板来解决边界处理问题 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值