模板1
模板代码:
int binarySearch(int[] nums, int target){
if(nums == null || nums.length == 0)
return -1;
int left = 0, right = nums.length - 1;
while(left <= right){
//防止int溢出
int mid = left + ((right - left)>>1);
if(nums[mid] == target)
return mid;
else if(nums[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
模板特征:
- 初始条件:left = 0, right = length-1
- 终止条件:left > right
- 向左查找:right = mid-1
- 向右查找:left = mid+1
应用场景:
可以看到模板中当num[mid]==target相等时,函数终止,因此
一般用于查找数组中某个特定的元素是否存在及其下标。
例题:
leetCode 374
模板2
int binarySearch(int[] nums, int target){
if(nums == null || nums.length == 0)
return -1;
int left = 0, right = nums.length;
while(left < right){
//防止int溢出
int mid = left + ((right - left)>>1);
//确保最终一定在左侧
if(nums[mid]<=target) left=mid;
else
right=mid-1;
}
return nums[left]==target?left:-1;
}
模板特征:
- 初始条件:left = 0, right = length
- 终止条件:left == right
- 向左查找:right = mid-1
- 向右查找:left = mid
应用场景:
可以看到模板中最后的那个元素满足条件的元素会出现最左端,因此一般用于查找数组中满足某一个条件的所有元素中最靠近左边的那个(如:寻找第一个大于target的数)
例题:
leetCode 278
模板3
int binarySearch(int[] nums, int target) {
if (nums == null || nums.length == 0)
return -1;
int left = 0, right = nums.length - 1;
while (left + 1 < right){//最后必然剩下两个元素
//防止int溢出
int mid = left + ((right - left)>>1);
if (nums[mid] < target) {
left = mid;
} else {
right = mid;
}
}
if(nums[left] == target) return left;
if(nums[right] == target) return right;
return -1;
}
模板特征:
- 初始条件:left = 0, right = length-1
- 终止条件:left + 1 == right
- 向左查找:right = mid
- 向右查找:left = mid
应用场景:
可以看到左右都有可能等于target,一般应用于找出数组中满足某一条件的所有数据。(如找出数组中所有等于target的元素)
例题:
leetCode 658