给定一个排序数组和一个目标值,在数组中找到目标值并返回其索引。如果数组中不存在目标值,则返回将按顺序插入的位置。您可以假设数组中没有重复元素。示例1:输入:[1,3,5,6],5输出:2示例2:输入:[1,3,5,6],2输出:1示例3:输入:[1,3,5,6],7Output:4例4:Input:[1,3,5,6],0Output:0这道题不难,但是为什么通过率比较低呢?是边界处理判断错误造成的。本题中,要在数组中插入目标值,无外乎这四种情况。搜索插入位置3目标值在数组所有元素之前目标值等于数组中的某个元素目标值在数组中插入的位置目标值在数组所有元素之后在这些之后四个条件都确认清楚了,就可以尝试解决问题了。接下来我将从暴力解法和二分法来解释这道题,同时也以此来谈谈二分查找的方法。暴力解题暴力解题不一定消耗很多时间,关键看实现方式,就像二分查找的时间消耗不一定低,是一样的。C++代码classSolution{public:intsearchInsert(vector&nums,inttarget){for(inti=0;i=target){//一旦发现它大于等于target的num[i],那么i就是我们想要的returnnums.size();//如果target最大,或者nums为空,则返回nums的长度}};时间复杂度:O(n)空间复杂度:O(1)效率如下:二分查找插入位置由于暴力破解的时间复杂度为O(n),所以尽量使用二分查找的方式。搜索插入位置4大家注意这道题的前提是数组是有序数组,这也是使用二分查找的基本条件。以后只要看到面试题给的数组是有序数组,就可以想想能不能用二分法。同时题目也强调数组中没有重复的元素,因为一旦有重复的元素,二分查找法返回的元素在下表中可能不唯一。一般解释二分法的思想。这是一个例子。例如,在这个数组中,使用二分法找到元素5的位置并返回它的下标。搜索插入位置5二分查找涉及到很多边界条件,逻辑比较简单,但是写的不好。相信很多同学都没有很好地处理二分查找法中的边界条件。例如,是while(left&nums,inttarget){intn=nums.size();intleft=0;intright=n-1;//在左闭右闭区间定义target,[left,right]while(left<=right){//当left==right时,区间[left,right]仍然有效intmiddle=left+((right-left)/2);//防止溢出相当于(left+right)/2if(nums[middle]>target){right=middle-1;//target在左区间,所以[left,middle-1]}elseif(nums[middle]&nums,inttarget){intn=nums.size();intleft=0;intright=n;//在左闭右开区间定义target,[left,right)targetwhile(left>1);if(nums[middle]>target){right=middle;//目标在左区间,在[left,middle)}elseif(nums[middle]