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;
}
}

浙公网安备 33010602011771号