日志 | 在排序数组中查找元素的第一个和最后一个位置| 搜索插入位置 |二分查找

力扣

截取来自b站up灵茶山艾府老师
局部截取_20250928_201105
局部截取_20250928_201136
局部截取_20250928_201557
局部截取_20250928_201618
!!
L-1一定为红;M+1一定为蓝。
返回值:L 目标值位置

  1. 大于等于8(8的第一个位置) : 返回L;
  2. 大于8 等价于 >= 9(9的第一个位置) :目标值变成8+1,返回L
  3. 小于等于8 等价于 >8的那个数位置-1(8的最后一个位置) :目标值变成8+1,返回L-1
  4. 小于8 等价于 (8的第一个位置 - 1) :目标值还是8,但返回L-1

局部截取_20250928_195403

点击查看代码
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;
    }
}

局部截取_20250928_215731

局部截取_20250928_215635

点击查看代码
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;
    }
}
posted @ 2025-09-28 22:04  柳成荫y  阅读(21)  评论(0)    收藏  举报