Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.
You may assume no duplicates in the array.
Here are few examples.
[1,3,5,6], 5 → 2
[1,3,5,6], 2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6], 0 → 0
和上一题一样 都是二分查找的变形
这个题和普通二分查找的区别仅在于 目标值不存在的时候并不是返回-1 而是返回当前ij汇合的值就行了
public int searchInsert(int[] nums, int target) {
int i = 0;
int j = nums.length -1;
int mid = (i + j) / 2;
while(i <= j){
mid = (i + j) / 2;
if(nums[mid] < target){
i = mid + 1;
}
else if(nums[mid] > target){
j = mid - 1;
}
else{
return mid;
}
}
if(target > nums[mid]) return mid+1;
else return mid;
}
发现这些题目 循环条件到底是
>= 还是>真是最最重要的事 这些情况我一般都不仔细思考
发现没A就加个=再试试 真是不好的习惯 今天就整理一下边界的考虑
回顾一下
循环的跳出情况:
--------------------------------------------
i j
mid
-------------------------------------------
此时如果target<v[mid] 那么就会变成 (j = mid - 1)
j i
mid (跳出循环)
--------------------------------------------
如果target>v[mid] 那么就会变成 (i = mid + 1)
ij
mid
--------------------------------------------
然后考虑大循环的跳出条件:
如果设置为:i<j 那么此时就一定会跳了
但是这样设置 没过用例[1,3] 4 看看target>v[mid]的情况
就会看到 此时只判断了 target比mid大 也许target还比j大呢
所以此时还不能跳出 应该进一步:
--------------------------------------------
ij
mid
--------------------------------------------
j i
mid (跳出循环)
--------------------------------------------
j i
mid (跳出循环)
--------------------------------------------
边界问题 带不带等于号都很重要!!!!!!!!!!!
仔细考虑!!!!!!!!!!!!!!!!!!!!!!