「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
- 示例4
输入: nums = [1,3,5,6], target = 0
输出: 0
- 示例5
输入: nums = [1], target = 0
输出: 0
- 提示:
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 为无重复元素的升序排列数组
- -104 <= target <= 104
解析
大家注意这道题目的前提是数组是有序数组,这也是使用二分查找的基础条件,因此毫无疑问比较好的算法是二分法来解答,但是需要注意的是,如果题目强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下表可能不是唯一的。
这道题目其实难度一般,看完题目,要在数组中插入目标值,总结有以下这四种情况。
- 目标值在数组所有元素之前
- 目标值等于数组中某一个元素
- 目标值插入数组中的位置
- 目标值在数组所有元素之后
复杂度:
- 时间复杂度:O(logn),n为数组中元素数量。
- 空间复杂度:O(1)。
示例
class Solution {
public int searchInsert(int[] nums, int target) {
int left =0;
int right = nums.length-1;
int result =nums.length;
while(left<=right){
int mid = ((right - left) >> 1) + left;
if (target <= nums[mid]) {
result = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return result;
}
}
运行结果:
执行结果:通过
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.1 MB, 在所有 Java 提交中击败了41.16%的用户