Leetcode:704. 二分查找(C++)

本文介绍了一种在有序数组中查找特定元素的高效算法——二分查找。通过示例展示了如何使用该算法来定位目标值并返回其在数组中的位置。文章提供了完整的 C++ 实现代码。

给定一个 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

实现代码:

class Solution {
public:
    int search(vector<int>& nums, int target) 
    {
        int low=0;
        int hight=nums.size()-1;
        while(low<=hight)
        {
            int mid=(low+hight)/2;
            if(nums[mid]>target)
            {
                hight=mid-1;
            }
            else if(nums[mid]<target)
            {
                low=mid+1;
            }
            else
            {
                return mid;
            }
        }
        return -1;
    }
};

二分查找,注意判断条件和low,hight取值即可。

Leetcode 704题是二分查找问题,在C++中有不同的实现方式。 一种实现方式如下: ```cpp class Solution { public: int search(vector<int>& nums, int target) { vector<int>::iterator it; it=find(nums.begin(),nums.end(),target); if(it!=nums.end()) return it-nums.begin(); return -1; } }; ``` 此实现使用了`std::find`函数来查找目标值。不过,这种方式并非严格意义上的二分查找,`std::find`函数会遍历整个数组,时间复杂度为$O(n)$,没有利用到数组有序的特性,效率较低 [^3]。 另一种实现方式是标准的二分查找: ```cpp // 版本二 class Solution { public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right) while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间,所以使用 < int middle = left + ((right - left) >> 1); if (nums[middle] > target) { right = middle; // target 在左区间,在[left, middle)中 } else if (nums[middle] < target) { left = middle + 1; // target 在右区间,在[middle + 1, right)中 } else { // nums[middle] == target return middle; // 数组中找到目标值,直接返回下标 } } // 未找到目标值 return -1; } }; ``` 该实现定义了目标值所在的区间为左闭右开区间`[left, right)`,在循环中不断根据中间元素与目标值的大小关系调整左右边界。时间复杂度为$O(log n)$,因为每次循环都将搜索范围缩小一半;空间复杂度为$O(1)$,只使用了常数级的额外空间 [^4]。 总结:对于有序数组的查找问题,二分查找是一种高效的算法,能将时间复杂度从线性的$O(n)$降低到对数级的$O(log n)$。在实现二分查找时,需要注意区间的定义(如左闭右开、左闭右闭等),不同的区间定义会影响循环的终止条件和边界的更新方式。同时,要避免使用像`std::find`这样的线性查找函数,应充分利用数组有序的特性来提高查找效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cosmoshhhyyy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值