前提:有序数组
注意:
题目:
模板:
左闭右闭
class Solution {
// 二分法(左闭右闭)
public int search(int[] nums, int target) {
int len = nums.length;
if(target<nums[0] && target>nums[len-1]) {
return -1;
}
int l = 0, r=len-1;
// 左右相等不再运行
while(l<r) {
int mid = l + ((r-l) >> 1);
if(nums[mid] == target) {
return mid;
} else if(nums[mid] < target) {
l = mid+1;
} else if(nums[mid] > target) {
r = mid-1;
}
}
return -1;
}
}
左闭右开
class Solution {
// 二分法(左闭右闭)
public int search(int[] nums, int target) {
int len = nums.length;
if(target<nums[0] && target>nums[len-1]) {
return -1;
}
int l = 0, r=len-1;
// 左右相等继续运行
while(l<r) {
int mid = l + ((r-l) >> 1);
if(nums[mid] == target) {
return mid;
} else if(nums[mid] < target) {
// 左闭
l = mid+1;
} else if(nums[mid] > target) {
// 右开
r = mid;
}
}
return nmus[mid] == target ? nums[mid] : -1;
}
}
错误情况
1. 遗漏边界情况
class Solution {
// 二分法(左闭右闭)
public int search(int[] nums, int target) {
int len = nums.length;
if(target<nums[0] && target>nums[len-1]) {
return -1;
}
int l = 0, r=len-1;
// 左右相等仍继续运行
while(l<r) {
int mid = l + ((r-l) >> 1);
if(nums[mid] == target) {
return mid;
} else if(nums[mid] < target) {
// mid不再参与下次的二分
l = mid+1;
} else if(nums[mid] > target) {
// mid不再参与下次的二分
r = mid-1;
}
}
return -1;
}
}
2. 死循环
class Solution {
// 二分法(左闭右闭)
public int search(int[] nums, int target) {
int len = nums.length;
if(target<nums[0] && target>nums[len-1]) {
return -1;
}
int l = 0, r=len-1;
// 左右相等仍继续运行
while(l<r) {
int mid = l + ((r-l) >> 1);
if(nums[mid] == target) {
return mid;
} else if(nums[mid] < target) {
l = mid;
} else if(nums[mid] > target) {
r = mid;
}
}
return -1;
}
}
测试用例:arr=[1,2],target=2。
相关链接:https://leetcode.cn/problems/binary-search/solutions/8337/er-fen-cha-zhao-xiang-jie-by-labuladong/