704. 二分查找
题目标签:
相似题目:
-
解题思路:
- 二分查找原理很简单,需要注意的是在不断二分的过程,如何控制区间划分的正确性,以及何时退出循环
-
代码:
// 递归的做法
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
int res;
if(target > nums[n-1] || target < nums[0]) return -1;
else res = dfs(nums, 0, n, target);
return res;
}
int dfs(vector<int>& nums, int start, int end, int target) {
if (start > end) { // 因为数列是离散的,当相邻两个值之间不存在tagert值时,下一次递归就会出现这种情况
return -1; // 如果start大于end,说明目标值不在范围内,返回-1
}
int middle = start + (end - start)/2;
if(nums[middle] == target) return middle;
else if(target > nums[middle]) return dfs(nums, middle+1 , end, target);
else return dfs(nums, start, middle-1, target);
}
};
//
// 循环做法
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right]
// 当left > right 时,意味着遍历结束了
while (left <= right) { // 当left==right,区间[left, right]依然有效,所以用 <=
int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
if (nums[middle] > target) {
right = middle - 1; // target 在左区间,所以[left, middle - 1]
} else if (nums[middle] < target) {
left = middle + 1; // target 在右区间,所以[middle + 1, right]
} else { // nums[middle] == target
return middle; // 数组中找到目标值,直接返回下标
}
}
// 未找到目标值
return -1;
}
};