在算法题中,二分查找是一个很基础的能力,但是很多情况下都有可能因为一些小条件导致整题的错误,所以我们需要学习并记忆正确的写法,本篇列出了三种情况下的写法
闭区间写法
int lower_bound(vector<int> &nums, int target) {int left = 0, right = (int) nums.size() - 1; // 闭区间 [left, right]while (left <= right) { // 区间不为空int mid = left + (right - left) / 2;if (nums[mid] < target)left = mid + 1; // 范围缩小到 [mid+1, right]elseright = mid - 1; // 范围缩小到 [left, mid-1]}return left; // 或者 right+1}
左闭右开区间写法
int lower_bound(vector<int> &nums, int target) {int left = 0, right = nums.size(); // 左闭右开区间 [left, right)while (left < right) { // 区间不为空int mid = left + (right - left) / 2;if (nums[mid] < target)left = mid + 1; // 范围缩小到 [mid+1, right)elseright = mid; // 范围缩小到 [left, mid)}return left; // 或者 right}
开区间写法
int lower_bound(vector<int> &nums, int target) {int left = -1, right = nums.size(); // 开区间 (left, right)while (left + 1 < right) { // 区间不为空int mid = left + (right - left) / 2;if (nums[mid] < target)left = mid; // 范围缩小到 (mid, right)elseright = mid; // 范围缩小到 (left, mid)}return right; // 或者 left+1}
以上就是二分查找的三种写法,对于具体题目的使用,我们后续再进行补充。