题目链接:力扣
思路:
这道题目属于简单类型的题目。但是也存在很大的坑。坑1:left与right的初始定界;坑2:二分过程中left和right的定界。
一般二分查找,有两种定界left 和 right 方式。
1. 左闭右闭 ,这时候right的取值就是数组的长度-1,即 right = nums.length - 1
2. 左闭右开 ,这时候right的取值不需要减一,即 right = nums.length
可以采取画图的方式:
1. 左闭右闭:
2. 左闭右开:
代码:
1. 左闭右闭
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] == target)
return mid;
}
return -1;
}
}
2. 左闭右开
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] > target) {
right = mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] == target)
return mid;
}
return -1;
}
}
总结:
二分查找算法 主要在于循环处的不变量,保证每次训练的边界都是一致的。