二分算法(灵神边界处理复习)
快速复习回顾一下
1.左闭右闭
int mid = left + (right - left)/2;
防止left + (right - left ) / 2 长度过长
边界条件: left == right时 由于左边和右边值相等 可以取
class Solution {public int search(int[] nums, int target) {int left = 0;int right = nums.length - 1;while(left<=right){int mid = left + (right - left)/2;if(target== nums[mid]) return mid;else if(nums[mid]>target) right = mid-1;else left = mid+1;}return -1;}}
其他边界条件(灵神题解):
// 左闭右开区间写法private int lowerBound2(int[] nums, int target) {int left = 0, right = nums.length; // 左闭右开区间 [left, right)while (left < right) { // 区间不为空// 循环不变量:// nums[left-1] < target// nums[right] >= targetint mid = left + (right - left) / 2;if (nums[mid] < target)left = mid + 1; // 范围缩小到 [mid+1, right)elseright = mid; // 范围缩小到 [left, mid)}return left; // 或者 right}// 开区间写法private int lowerBound3(int[] nums, int target) {int left = -1, right = nums.length; // 开区间 (left, right)while (left + 1 < right) { // 区间不为空// 循环不变量:// nums[left] < target// nums[right] >= targetint mid = left + (right - left) / 2;if (nums[mid] < target)left = mid; // 范围缩小到 (mid, right)elseright = mid; // 范围缩小到 (left, mid)}return right; // 或者 left+1}
}作者:灵茶山艾府
链接:https://leetcode.cn/problems/binary-search/solutions/2023397/er-fen-cha-zhao-zong-shi-xie-bu-dui-yi-g-eplk/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
解释:
左闭右开(最右端) 不取所以长度+1;