Skip to content

704. 二分查找

我写的第一个题目!

原版二分查找题目,从这个题目了解二分查找。

基本思想:把整个有序数组从中间切开。看中间这个元素和我要找的东西之间的关系,如果要找的比这个东西还大,按照升序的原则,那要找的应该在右边,我应该去右边那个块找;如果要找的比这个东西还小,按照升序的原则,要找的在左边,去左边这个块找;如果就是这个,那不就好了吗,找到了啊,退出。

怎么界定目前找的是哪一个”块“?用区间的概念。左闭右闭的区间,用leftright存储,作为左右边界。中间的位置,直接左右边界加起来除以2.

怎么做到所谓的”去左边/右边的块“?那就调整区间的边界呗,你这个middle把正在查找的块分成了,middle本身和左右两个区域,去左边就让右边界缩回到middle左边,去右边就让左边界缩回到middle右边。

while (left <= right)这个条件,因为左边界等于右边界代表这个闭区间还是存在的,只不过只有一个元素了,但终究是没被搜索过,还需要继续进行。

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