14a281266fd24602a7d759ee421e7c5d.png

【题目】:704. 二分查找
左闭右闭区间[l, r]

class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0, r = nums.size() - 1;
int mid = l + (r - l) / 2;
while(l <= r) { // 因为边界条件:[1, 1]时,l = r
if(nums[mid] == target) {
return mid;
}else if(nums[mid] > target) {
r = mid - 1; // 因为是左闭右闭,nums[mid]已经不满足了,所以r = mid - 1(跳过mid)
}else {
l = mid + 1;
}
mid = l + (r - l) / 2;
}
return -1;
}
};
  • 时间复杂度: O(logn)
  • 空间复杂度: O(1)

左闭右开区间[l, r):

class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0, r = nums.size();
int mid = l + (r - l) / 2;
while(l < r) { // 因为边界条件:[1, 1),不包含l = r的情况
if(nums[mid] == target) {
return mid;
}else if(nums[mid] > target) {
r = mid; // 因为是左闭右开,右边是开区间,所以nums[mid]不在这个区间中
}else {
l = mid + 1;
}
mid = l + (r - l) / 2;
}
return -1;

}
};