题目:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1: 输入: [1,3,5,6], 5 输出: 2
示例 2: 输入: [1,3,5,6], 2 输出: 1
示例 3: 输入: [1,3,5,6], 7 输出: 4
示例 4: 输入: [1,3,5,6], 0 输出: 0
一、采用模板 2
需要查看 当前位置 和 右边位置,
采用模板 2 ,因为如果不存在,要插入的位置是尽量靠右
的。
另外,加上后处理。
class Solution {
public int searchInsert(int[] nums, int target) {
if( nums.length<1 )return 0;
int i = 0;
int j = nums.length-1;
while( i<j ){
int mid = i+(j-i)/2;
if( nums[mid]==target ){
return mid;
}else if( nums[mid]<target ){
i = mid+1;
}else{
j = mid;
}
}
if( nums[i]<target )return nums.length;
return i;
}
}
二、模板1
采用最基础的模板 1 来做,最后如果没有找到,返回 i(left)就可以。
因为,如果不存在目标值,查找到最后一定会有两个位置:
a 比目标值小,b 比目标值大。
那么在查找的时候,j 和 i 一定会移动, 最终 i 和 j 相等的位置,不管在 a 还是在 b ,i 都会跑到 b 的位置:
i==j 在 a
,那 mid 到了 a ,那i + 1
,到了 b 的位置;i==j 在 b
,那mid 到了 b,那j -1
,i 没变
,还是 b 的位置。
所以 返回 i 就是答案。
class Solution {
public int searchInsert(int[] nums, int target) {
if( nums.length<1 )return 0;
int i = 0;
int j = nums.length-1;
while( i<=j ){
int mid = i+(j-i)/2;
if( nums[mid]==target ){
return mid;
}else if( nums[mid]<target ){
i = mid+1;
}else{
j = mid-1;
}
}
return i;
}
}