题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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 <= 10^4
- -10^4 <= nums[i] <= 10^4
- nums 为 无重复元素 的 升序 排列数组
- -10^4 <= target <= 10^4
解题思路:
时间复杂度为 O(log n)
的算法,则采用二分法。
二分法思路:LeetCode-704 二分查找
二分法最关键的是边界条件的判断,此题的边界问题:
(1)循环到low==high
时,mid=low=high,此时是最后一个数字。
(2)nums[mid] == target则直接返回mid的下标。
(3)nums[mid] != target,则数组里没有target,需要插入,两种情况:
①如果nums[mid]>target,则将target插入mid下标的位置,而原本的mid下标的数字向右移(小→大)。即最终输出mid,而此时mid=low=high。
②如果nums[mid]<target,则将target插在mid下标的右侧,即最终输出mid+1。
可见low==high
时仍然满足循环体。
代码:
class Solution {
public int searchInsert(int[] nums, int target) {
int low = 0 ,high = nums.length-1;
int mid = 0;
while(low<=high) {
mid = (low+high)/2;
if(nums[mid] == target) return mid;
if(nums[mid]>target) {
high = mid-1;
}else {
low = mid+1;
}
}
return low;
}
}