二分查找
1 非减序列查找目标值
思路:直接使用闭区间二分查找,闭区间二分查找优点,若查找的数不在,返回的是插入位置
public int searchBin20241020(int[] nums, int target){
int n = nums.length;
int left = 0, right = n - 1;
while (left <= right){
int mid = left + (right - left) / 2;
if (nums[mid] < target){
left = mid + 1;
}else {
right = mid - 1;
}
}
return left;
}
2 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
这里可以看一下:二分查找 红蓝染色法_哔哩哔哩_bilibili 这位up的讲解,讲的很到位 ,看完能知道 >= > < <= 之间的转换。对这题至关重要
public int[] searchRange(int[] nums, int target) {
int start = binsearch(nums, target); //>= 注意整数中 >x 可转成 >=x+1;<x 可转成 (>=x)-1; <=x 可转成 (>x)-1 ==> (>=x+1)-1
if (start == nums.length || nums[start] != target){
return new int[]{-1,-1};
}
int end = binsearch(nums, target + 1) - 1; //<=
return new int[]{start, end};
}
public int binsearch(int[] nums, int target){
int left = 0, right = nums.length - 1;
while (left <= right){
int mid = left + (right - left) / 2;
if (nums[mid] < target){
left = mid + 1;
}else{
right = mid - 1;
}
}
return left;
}