题目分析:
这道题的意思就是 当目标值在数组中时是搜索问题,当目标值不在数组中时是插入问题,可以全都看作插入问题来思考,插入位置有四种情况:
1.目标值插入在数组最前面
2.目标值插入在某个数组元素上
3.目标值插入在两个数组元素之间
4.目标值插入在数组最后面
暴力法:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
for(int i = 0; i < nums.size(); i++){
if (target <= nums[i]){
return i;
}
}
return nums.size();
}
};
空间复杂度O(1)
时间复杂度O(n)
二分法:
看到题目中说使用时间复杂度为O(log n)的算法,以及题目中为有序数组,自然想到二分法
1.目标值插入在数组最前面
插入2。
left=0,right=3;
mid=1,left=0,right=0;
mid=0,left=0,right=-1;
跳出循环,应该返回0,也就是left或者right+1;
2.目标值插入在某个数组元素上
插入5。
left=0,right=3;
mid=1,返回1,也就是mid;
3.目标值插入在两个数组元素之间
插入7。
left=0,right=3;
mid=1,left=2,right=3;
mid=2,left=3,right=3;
mid=3,left=3,right=2;
跳出循环,应该返回3,也就是left或者right+1;
4.目标值插入在数组最后面
插入9。
left=0,right=3;
mid=1,left=2,right=3;
mid=2,left=3,right=3;
mid=3;left=4,right=3;
跳出循环,应该返回4,也就是left或者right+1
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right){
int mid = (left + right) / 2;
if (target < nums[mid])
right = mid - 1;
else if (target > nums[mid])
left = mid + 1;
else
return mid;
}
return left;
//或者 return right+1;
}
};