几种常见的模板:(都是使用左闭右闭区间)
/**
* 找数组中第一个 >= 目标值的索引
* 没找到则返回数组长度值
* 思路:
* left要大于right, 则nums[mid] >= target时 right = mid - 1, 是right降到小于目标值的位置, 然后left跨过去
* left 固定必须为 mid + 1
* 没找到则返回数组长度值
*/
public static int searchGeTarget(int[] nums, int target){
int left = 0;
int right = nums.length - 1;
while (left <= right){
int mid = (right - left) / 2 + left;
if (nums[mid] >= target){
right = mid - 1;
} else { //相当于left在nums[mid]<target时跨过去
left = mid + 1;
}
}
return left;
}
/**
* 找数组中第一个 > 目标值的索引
* 没找到则返回数组长度值
*/
public static int searchGtTarget(int[] nums, int target){
int left = 0;
int right = nums.length - 1;
while (left <= right){
int mid = (right - left) / 2 + left;
if (nums[mid] > target){
right = mid - 1;
} else { //相当于left在nums[mid]<=target时跨过去
left = mid + 1;
}
}
return left;
}
/**
* 找数组第一个 <= 目标值的索引(4,4,4,4)的右边界
* 没有则返回-1
*/
public static int searchLeTarget(int[] nums, int target){
int left = 0;
int right = nums.length - 1;
while (left <= right){
int mid = (right - left) / 2 + left;
if (nums[mid] > target){ //相当于right在nums[mid]>target时跨过去
right = mid - 1;
} else {
left = mid + 1;
}
}
return right;
}
/**
* 找数组第一个 < 目标值的索引(4,4,4,4,5)的右边界5
* 没有则返回-1
*/
public static int searchLtTarget(int[] nums, int target){
int left = 0;
int right = nums.length - 1;
while (left <= right){
int mid = (right - left) / 2 + left;
if (nums[mid] >= target){ //相当于right在nums[mid]>=target时跨过去
right = mid - 1;
} else {
left = mid + 1;
}
}
return right;
}
欢迎微信搜索个人公众号:楠哥毕设帮
提供个人二开项目源码、部署讲解、论文指导~