leetcode/notes/src/bin_search.md

2.1 KiB
Raw Blame History

二分查找

适用于数组有序的情况下查找目标值。

写法一

针对左闭右闭区间(即 [left, right]

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;
  }
};

写法二

针对左闭右开(即 [left, right)

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;
  }
};

相关题目