二分查找

· · 个人记录

题目:leetcode(704)704. 二分查找 - 力扣(LeetCode)

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

代码:(左闭右闭,[low, high],时刻考虑数据是否在范围内)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int low = 0, high = nums.size() - 1;  // 注意这个size-1是数组最后一位

        while (low <= high)  // 若low = high = 1,[1, 1]合法,故是<=
        {
            int mid = low + (high - low) / 2;  // 防止超int范围,(low+high)/2可能会爆

            if (nums[mid] == target)
            {
                return mid;
            }
            else if (nums[mid] < target)
            {
                low = mid + 1;  // nums[mid]不是target,所以mid+1
            }
            else 
            {
                high = mid - 1;  // 同理
            }
        }
        return -1;
    }
};

代码:(左闭右开,[low, high),时刻考虑数据是否在范围内)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int low = 0, high = nums.size();  // 注意这个size是数组最后一位+1,右边开区间不包括在内

        while (low < high)  // 若low = high = 1,[1, 1)不合法,故是<
        {
            int mid = low + (high - low) / 2;  // 防止超int范围,(low+high)/2可能会爆

            if (nums[mid] == target)
            {
                return mid;
            }
            else if (nums[mid] < target)
            {
                low = mid + 1;  // nums[mid]不是target,所以mid+1
            }
            else 
            {
                high = mid;  // 右区间是开区间
            }
        }
        return -1;
    }
};

文章参考《代码随想录》二分查找:代码随想录 (二分查找)