给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
分析:把问题分解,如题所给实例,有四种可能的结果:
- target=nums中的值。如示例1
- target插入nums某个数之中。如示例2
- target>nums中的所有元素。如示例3
- target<nums中的所有元素。如示例4
方法一:暴力破解
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
for(int i = 0; i < nums.size(); i++){
if(target < nums[0]) return 0; //target < nums中的所有元素
//if(target == nums[i]) return i; //target为nums中的一个
if(nums[i] >= target) //target插入nums中的某个位置
return i;
}
return nums.size(); //target > nums中所有元素,返回最大值
}
};
时间复杂度O(n)
空间复杂度:O(1)
方法二:二分查找法
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while(left <= right){ //二分查找target
int mid = (left + right)/2;
if(nums[mid] > target){
right=mid-1;
}
else if(nums[mid] < target) {
left=mid+1;
}
else{
return mid;
}
}
return right+1; //若没有直接命中,其他三种情况均可用right+1表示。
}
};
时间复杂度:O(lgn)
空间复杂度:O(1)