给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 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
-
暴力求解法:(略)
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(1) -
两分法:
复杂度分析:
时间复杂度:O(logn)
空间复杂度:O(1)
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int end = nums.size() - 1;
int begin = 0;
while(begin <= end)
{
int center = (begin+end)/2;
if(target == nums[center])
return center;
else
{
if (target < nums[center])
end = center-1;
else
begin = center + 1;
}
}
return begin;
}
};
注意:
- while循环条件,如果是begin == end, 会导致输入为
nums = [1,3]; target = 2;
时出现死循环 - 最后return的值是begin,如果return center的话,需要额外增加判断语句判断center的值是大于还是小于target
- 缩小二分边界的时候,注意不要包括center,即
end = center-1;
或者begin = center + 1;
- 在C++的algorithm头文件里包括了二分查找的函数,即一行搞定代码为:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
return lower_bound(nums.begin(),nums.end(),target)-nums.begin();
}
};
附:C++二分查找函数介绍:https://www.cnblogs.com/Tang-tangt/p/9291018.html
- lower_bound(val):返回容器中第一个值【大于或等于】val的元素的iterator位置。(如果有等于val的多个元素的值,则会返回第一个val出现的位置)
- upper_bound(val): 返回容器中第一个值【大于】val的元素的iterator位置。(如果有等于val的多个元素的值,则会返回最后一个val出现的位置)
- binary_search(起始地址,结束地址,要查找的数值) 返回的是是否存在这么一个数,是一个bool值。