本题的主要思路是二分法。(因为观察到数组为升序排列,因此可以考虑使用二分法)
主要思路如下:
(1)定义左右指针并为其赋初值,min为左指针赋初值为0,max为右指针赋初值为len-1。
(2)定义for循环,循环内定义int mid为中间指针,每次循环都将mid赋值为
mid=min+(max-min)/2 (防止溢出),循环条件为min<=max。
(3)进入循环内判断:
如果nums[min]<target,表示min到max位置里恰好没有target,min刚刚超过target,则直接返回min;
如果nums[max]>target,表示min到max位置里恰好没有target,max刚刚小于target,则直接返回max+1;
(在确定返回值与min、max关系时,我直接拿具体数值举了例子)
(4)如果都满足上述条件,即表示target在min 到 max之间。
如果nums[mid]==target表示正好找到,则直接返回mid;
如果nums[mid]<target表示target在mid的右半部分,则使min=mid+1;
如果nums[mid]>target表示target在mid的左半部分,则使max=mid-1;
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int len=nums.size();
int min=0,max=len-1;//定义左右指针
for(int mid=min+(max-min)/2;min<=max;mid=min+(max-min)/2){
if(nums[min]>target) return min;
if(nums[max]<target) return max+1;
if(nums[mid]==target) return mid;
if(nums[mid]<target) min=mid+1;
else if(nums[mid]>target) max=mid-1;
}
return -1;
}
};