这是一个方法:但总觉得不容易表达,写起来和二分非常相似
class Solution {
public int searchInsert(int[] nums, int target) {
int left=0;
int right=nums.length-1;
int mid=0;
while(left<=right)
{
mid=left+(right-left)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]>target)
right = mid-1;
else if(nums[mid]<target)
left = mid+1;
}
return left;
}
}
方法二
根据热门题解和b站up主的技巧
这道题我们看作,找到>=target的位置
1、每次缩小一半的范围
2、每次缩小的范围要把答案包含在内
那么思路是这样的
if(nums[mid]>target)//当前的mid有可能是我们要找的位置,范围应该被包含,比如
【1 3 5 6 mid在3这个位置,插入的是2,它可能就放在mid(3)的位置】
所以 right=mid;
if(nums[mid]<target)//要找的位置一定是在>=mid+1之后的位置,而不是>=mid之后的位置,因为当前的mid比target小
【1 3 5 6 mid在3这个位置,插入的是4,它可能就放在mid+1(5)的位置】
class Solution {
public int searchInsert(int[] nums, int target) {
int left=0;
int right=nums.length-1;
int mid=0;
while(left<=right)
{
mid=left+(right-left)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]>target)
right = mid-1;
else if(nums[mid]<target)
left = mid+1;
}
return left;
}
}
方式二更合乎逻辑,而且终止条件是left=right 返回left或right都可以
方式一更像是找规律出来的,找头尾中target的位置推导一下,很容易写,但是不好表达出来,终止条件是left<=right 返回left
昨天写只能写出方式一,今天方式二也能想出来了,证明想不出来先放一放,改天再回来看,可能就能想出来