日志 | 在排序数组中查找元素的第一个和最后一个位置| 搜索插入位置 |二分查找
力扣
截取来自b站up灵茶山艾府老师




!!
L-1一定为红;M+1一定为蓝。
返回值:L 目标值位置

点击查看代码
class Solution {
public int[] searchRange(int[] nums, int target) {
int first = local_first(nums,target);
if( first == nums.length || nums[first] != target) return new int[]{-1,-1};//需要判断是否是目标值,因为可能不是目标值,比如目标值是6,找到了大于等于6的数是7的位置。
int last = local_first(nums,target + 1) - 1;
return new int[]{first,last};
}
/*
**闭区间写法[l,r]
**如果数组全小于目标值,left一直向右移动出数组,left就是数组长度。
**返回值:如果存在目标值,返回第一个目标值的下标即left。
*/
public static int local_first(int[] nums, int target){
int left = 0,right = nums.length - 1;
while(left <= right){
int zhong = left+ (right - left) /2;
if(nums[zhong] < target){
left = zhong + 1;
}
else if(nums[zhong] >= target){
right = zhong - 1;
}
}
return left;
}
/**
开区间写法
*/
public static int local1(int[] nums, int target){
int left = -1,right = nums.length;
while(left + 1 < right){
int zhong = left+ (right- left)/2;
if(nums[zhong] < target){
left = zhong;
}
else if(nums[zhong] >= target){
right = zhong;
}
}
return right;
}
}


点击查看代码
class Solution {
public int searchInsert(int[] nums, int target) {
int first = first_num(nums,target);
if(first != target){
return first;
}
else if(first == nums.length){
return nums.length - 1;
}
return first;
}
public int first_num(int[] nums, int target){
int l = 0, r = nums.length - 1;
while( l <= r){
int m = l + (r - l)/2;
if(nums[m] < target){
l = m + 1;
}
else{
r = m - 1;
}
}
return l;
}
}
浙公网安备 33010602011771号