题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
为 无重复元素 的 升序 排列数组-104 <= target <= 104
解答
目标元素有以下几种情况:
1.插入在数组头部
2.插入数组中某个位置
3.在数组中找到该元素
4.插入数组尾部
因此可用顺序遍历或者二分查找来解题
- 顺序遍历整个数组的暴力解法
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
for(int i = 0; i < nums.size(); i++)
{
if(nums[i] == target)
{
return i;
}
else if(nums[i] > target){
return i;
}
}
return nums.size();
}
};
- 使用二分查找法进行位置的查找
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int l=0,r=nums.size()-1;
// 我们定义target在左闭右闭的区间里,[left, right] ,当left==right,区间[left, right]依然有效
while(l<=r)
{
int mid=l+(r-l)/2;
if(nums[mid]<target)
{
l=mid+1;// target 在右区间,所以[middle + 1, right]
}
else if(nums[mid]==target)
{
return mid;
}
else
{
r=mid-1;// target 在左区间,所以[left, middle - 1]
}
}
return r+1;
}
};