二分法主要是: while循环中的边界值, 是用left <= right 还是left < right呢?
取决于 right的取值:
1、int right = nums.length -1;
说明right的索引位置是有效值,需要与target比较.
那么在while循环判断里要加=, while基调定了为 left <= right (表明right是需要参与和target进行比较的),则right需要重新赋值的时候需要mid-1.
class Solution {
public int search(int[] nums, int target) {
if (nums.length<=0 || target < nums[0] || target > nums[nums.length-1]) {
return -1;
}
int right = nums.length -1;
int left = 0;
while(left<=right) {
int mid = left + ((right - left) >> 1);
if(nums[mid] == target) {
return mid;
}
if (nums[mid] > target) {
right = mid-1;
}
if(nums[mid] < target) {
left = mid+1;
}
}
return -1;
}
}
2、int right = nums.length;
说明right的索引位置不是有效值,不需要与target比较.
那么在while循环判断里要加, while基调定了为 left < right (表明right不需要参与和target进行比较的),则right需要重新赋值的时候需要mid.
public int search(int[] nums, int target) {
if (nums.length<=0 || target < nums[0] || target > nums[nums.length-1]) {
return -1;
}
int right = nums.length;
int left = 0;
while(left<right) {
int mid = left + ((right - left) >> 1);
if(nums[mid] == target) {
return mid;
}
if (nums[mid] > target) {
right = mid;
}
if(nums[mid] < target) {
left = mid+1;
}
}
return -1;
}