二分查找+相关练习

2022-11-14 17:23:55 浏览数 (2)

1、定区间

2、对比   -》 再定区间

704. 二分查找 - 力扣(LeetCode)

一、左闭右闭区间

代码语言:javascript复制
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right]
        while (left <= right) { // 当left==right,区间[left, right]依然有效,所以用 <=
            int middle = left   ((right - left) / 2);// 防止溢出 等同于(left   right)/2
            if (nums[middle] > target) {
                right = middle - 1; // target 在左区间,所以[left, middle - 1]
            } else if (nums[middle] < target) {
                left = middle   1; // target 在右区间,所以[middle   1, right]
            } else { // nums[middle] == target
                return middle; // 数组中找到目标值,直接返回下标
            }
        }
        // 未找到目标值
        return -1;
    }
};

二、左闭右开区间

代码语言:javascript复制
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;
    }
};

总结:

解决此题的关键是在理解区间问题。

左闭右闭区间,两端都能取值,自然区间改变时,middle值不能选取,而是要加一或减一。

同理,如果端点值不能取到,则middle值可取,不需要加一或减一。

ode

0 人点赞