题目:
给定一个排序的整数数组 nums 和一个整数目标值 target ,请在数组中找到 target ,并返回其下标。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 :
输入: nums = [1,3,5,6], target = 5 输出: 2
思路:
主要思路是二分查找,掌握二分查找模板。
关键一步是没有这个值时怎么处理。
分为三种情况:
1.target最小,插到最前面
2.target在中间
3.target最大,插到最后面
具体的实现过程和思路见代码以及其中注释。
代码:
public int searchInsert(int[] nums, int target) {
//二分法
int left = 0;
int right = nums.length-1;
while(left<=right){
int mid=left+((right-left) >> 1);//避免溢出
if(nums[mid]>=target){
if(mid==0||nums[mid-1]<target){//nums[mid-1]<target这句判断是核心,好好体会
return mid;
}
right = mid-1;
}
else {
left =mid+1;
}
}
return nums.length;//是target最大的情况
}