[LeetCode] 704. Binary Search
Description
Given a sorted (in ascending order) integer array nums
of n
elements and a target
value, write a function to search target
in nums
. If target
exists, then return its index, otherwise return -1
.
Example 1:
Input: nums = [-1,0,3,5,9,12], target = 9
Output: 4
Explanation: 9 exists in nums and its index is 4
Example 2:
Input: nums = [-1,0,3,5,9,12], target = 2
Output: -1
Explanation: 2 does not exist in nums so return -1
Note:
- You may assume that all elements in
nums
are unique. - n will be in the range
[1, 10000]
. - The value of each element in
nums
will be in the range[-9999, 9999]
.
Analyse
从一个list里找出一个数,不存在则返回-1
使用二分查找,每次将问题的规模减半
int search(vector<int>& nums, int target)
{
int left = 0;
int right = nums.size() - 1;
int mid = (left + right) / 2;
while (left <= right)
{
if (nums[mid] == target)
{
return mid;
}
else if (nums[mid] > target)
{
right = mid - 1;
}
else if (nums[mid] < target)
{
left = mid + 1;
}
mid = (left + right) / 2;
}
return -1;
}
leetcode中最快的方法是调用STL中的lower_bound
函数
template <class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val);
lower_bound
在[first
, last
)的左闭右开区间寻找第一个不小于val
的元素,采用了二分查找的思想
Returns an iterator pointing to the first element in the range [first,last) which does not compare less than val.
在这个区间找到满足条件的就返回指向这个值的iterator, 否则返回last
,
An iterator to the lower bound of val in the range.
If all the element in the range compare less than val, the function returns last.
由于lower_bound
是左闭右开的搜索,最后一个值未覆盖到,好在如果没找到回直接返回last
,对lower_bound
返回的值判断一下是否是target
就可以覆盖对最后一个元素的搜索
int search(vector<int>& nums, int target)
{
static int fast_io = []() { std::ios::sync_with_stdio(false); cin.tie(nullptr);
return 0; }();
auto it = lower_bound(nums.begin(),nums.end(),target);
return (it!=nums.end() && *it==target) ? it-nums.begin() : -1; //这里解决了val出现在最后的产生的问题
}