题目描述:

题目分析:
本题是一个二分查找,核心思路是通过计算中心点和目标值的大小关系,以此在一个while循环里不断更新左右端点,知道左端点大于右端点。
代码:
java
class Solution {
public int searchInsert(int[] nums, int target) {
int n=nums.length;
int right=n-1;
int left=0;
while(left<=right){
int mid=(right-left)/2+left;
if(target>nums[mid]){
left=mid+1;
}else{
right=mid-1;
}
}
return left;
}
}
代码要点分析:
1.中心点的计算为mid=(right-left)/2+left,这样做是为了防止整数溢出。
2.left<=right,若目标值存在于数组中,最后一个可能的 left 和 right 是相同的,left < right 会错过一些情况。具体来说,在 left == right 时,依然需要检查这个位置。
3.不必判断target==nums[mid]的情况,在target==nums[mid]时直接把mid更新为right-1,如果后续范围数组里还有target,那么二分查找依旧能查找到范围里的target;如果这已经是最左边的target,那么随后循环里就会出现target>nums[mid]的情况,此时left就会不断右移,知道nums[left]=target。