解题思路 1
题意是叫你在排序的数组中寻找一个目标值并且时间复杂度是O(log n),就可以想到采用二分法。题目还要求如果这个数在数组中不存在的时候返回顺序插入的位置,那这个时候还可以用二分法吗?
假设这个插入的位置是pos,成立的条件是nums[pos-1] < target <= nums[pos],如果存在这个目标值,返回的也是pos,所以得意合并得出最后的目标: ** 在一个有序数组中找第一个大于等于target的下标 **。
C++
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0, right = nums.size()-1;
int ans = nums.size();
while(left <= right)
{
int mid = (right - left)/2 + left;
if(target <= nums[mid])
{
ans = mid;
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return ans;
}
};
解题思路 2
- 采用二分查找,当left<=right 时,执行循环内的程序。
- 如果target<nums[mid], right = mid-1;
- 如果target>nums[mid],left = mid+1;
- 如果相等,直接返回mid;
- 否则,程序最后返回left。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0, right = nums.size()-1;
int mid = (right + left)/2;
while(left <= right)
{
if(target == nums[mid])
return mid;
else if(target < nums[mid])
right = mid-1;
else
left = mid+1;
mid = (right + left)/2;
}
return left;
}
};
小结
时间复杂度:O(log n)
空间复杂度:O(1)
注意: int mid = (right - left)/2 + left;
等价于mid = ((right - left)>> 1)+ left;