题目:搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
提示:
nums为 无重复元素 的 升序 排列数组
解题思路
由题意分析:要在数组中插入目标值,无非是四种情况。
- 目标值在数组所有元素之前
- 目标值等于数组中某一个元素
- 目标值插入数组中的位置
- 目标值在数组所有元素之后
一个排序数组和一个目标值。这道题要我们做什么?先去看数组中有没有这个目标值,有的话,找到它,返回索引;没有的话,按顺序把它插入到合适位置。
既然给的数组是已经排好序的数组,刚好可以使用二分查找(后面有详细的二分查找解析),去查,查到了就返回索引;查不到就插入到合适位置
将目标值target与中间元素值进行比较: 1.如果target<中间元素:则在前面一半元素中继续寻找 2.如果target=中间元素:匹配成功,找到了 3.如果target>中间元素:则在后面一半元素中继续。
- 数组元素等于目标值,直接返回下标
- 数组是升序排列的,如果数组中没有目标值, 遍历时第一个大于目标值的元素就是目标值要插入的位置, 返回下表
- 若都不符合,目标值则应插到末尾,即下标为数组长度
代码实现
public int searchInsert(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
if (nums[i] >= target) {
return i;
}
}
return nums.length;
}
运行结果
复杂度分析
- 空间复杂度:O(1)
- 时间复杂度:O(n)
在掘金(JUEJIN) 一起分享知识, Keep Learning!