63.搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例2:

输入: nums = [1,3,5,6], target = 2
**输出: **1

示例3:

输入: nums = [1,3,5,6], target = 7
输出: 4

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 为 无重复元素 的 升序 排列数组
  • -104 <= target <= 104

代码:
1.寻找第一个大于等于目标值的位置

class Solution {
    public int searchInsert(int[] nums, int target) {
        //题目本质为寻找第一个大于等于target的元素位置
        //初始化左右指针
        int l = 0,r = nums.length-1;
        //二分查找
        while(l<r){
            //计算中间位置
            int mid = l+r>>1;
            //如果中间值大于等于目标值,调整右指针
            if(nums[mid] >= target)r = mid;
            //否则调整左指针
            else l = mid+1;
        }
        //如果在数组中找到目标值,直接返回找到的位置l
        if(target == nums[l])return l;
        //如果目标值比数组中所有元素都大,则插入到数组尾部
        else if(target>nums[l])return nums.length;
        //否则插入到第一个大于等于target的元素位置l
        else return l;
    }
}

2.寻找最后一个小于等于目标值的位置

class Solution {
    public int searchInsert(int[] nums, int target) {
        //寻找最后一个小于等于target的元素位置
	    //初始化左右指针
        int l = 0,r = nums.length-1;
	    //二分查找
        while(l<r){
            //向上取整
            int mid = l+r+1>>1;
            //满足条件,向右收缩
            if(nums[mid] <= target)l = mid;
            //不满足条件,向左扩张
            else r = mid-1;
        }
        //如果在数组中找到目标值,直接返回找到的位置l
        if(target == nums[l])return l;
        //如果目标值比数组中所有元素都小,则插入到数组头部
        else if(target<nums[l])return 0;
        //否则插入到最后一个小于等于target的元素位置l的下一个位置l+1
        else return l+1;
    }
}
posted @ 2025-05-04 11:03  回忆、少年  阅读(9)  评论(0)    收藏  举报