[leetcode]704.二分查找
704. 二分查找
Difficulty: 简单
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
提示:
- 你可以假设
nums
中的所有元素是不重复的。 n
将在[1, 10000]
之间。nums
的每个元素都将在[-9999, 9999]
之间。
Solution 1
class Solution {
public:
int search(vector<int>& nums, int target) {
int size = nums.size();
int left = 0, right = size; int mid;
while (left < right) {
mid = left + (right - left) >> 1;
if (nums[mid] == target) {
return mid;
}
else if (nums[mid] > target) {
right = mid;
}
else {
left = mid + 1;
}
}
return -1;
}
};
思路
二分查找针对有序数组,每次选取数组中点进行对比,等于中点直接返回,大于中点则说明在中点右侧,小于中点则说明在左侧。
solution 2
class Solution {
public:
int search(vector<int>& nums, int target) {
return search(nums,0,nums.size(),target);
}
int search(vector<int>& nums,int left,int right,int target){
while(left < right){
int mid = left + (right - left) >> 1;
if(nums[mid] == target){
return mid;
} else if(nums[mid] > target){
return search(nums,left,mid,target);
} else {
return search(nums,mid+1,right,target);
}
}
return -1;
}
};
思路
递归写法
注意
- 注意端点,这里采取左闭右开的策略,即右侧端点不被考虑,因此函数传值的时候直接把右侧端点传入即可,不需要减一
- 注意直接
left+right
直接相加可能导致整型溢出,因此采用left + (right - left) >> 1
代替- 尽量别用递归写法,比较耗空间,还容易栈溢出
后记
三鹿蛋的题目,反正我是没想到居然这么简单😔,但是我只写出破绽百出的递归写法,这题刷的太恶心我了