目录
一、关键要点
1、理解“左闭右闭”、“左闭右开”
左闭右闭:如区间 [left,right] ,则左右端点都属于可选的值
左闭右开:如区间 [left,right) ,则右端点不可选
2、所有的代码都根据预先设定的左闭右闭、左闭右开来写
二、两种写法
1、左闭右闭
int binarySearch(vector<int> &nums, int target)
{
int left = 0, right = nums.size() - 1; // 在 [left,right] 中,right 是可选的,因此应初始化为 nums.size() - 1
while (left <= right) // 之所以用 <= 是因为在 [left,right] 中,left 和 right 都可取
{
int mid = (left + right) / 2; // 或者 int mid = (right - left) / 2 + left;
if (nums[mid] > target)
{
right = mid - 1; // 之所以要 -1 是因为此时 mid 位置已经不符合要求,而且是 [left,right] 区间,mid 位置不可选,只能 -1
}
else if (nums[mid] < target)
{
left = mid + 1; // +1 的理由同上
}
else
{
return mid; // 找到了目标值
}
}
return -1; // 没找到目标值
}
2、左闭右开
int binarySearch(vector<int> &nums, int target)
{
int left = 0, right = nums.size(); // 在 [left,right) 中,right 不可选,但搜索的区间应当包含 nums.size() - 1 ,因此初始化为 nums.size()
while (left < right) // 之所以用 < 是因为在 [left,right) 中,right 不可取
{
int mid = (left + right) / 2; // 或者 int mid = (right - left) / 2 + left;
if (nums[mid] > target)
{
right = mid; // 此时 mid 位置已经不符合要求,而且是 [left,right) 区间,right 位置本来就不可选,因此 right 可以直接 等于 mid
}
else if (nums[mid] < target)
{
left = mid + 1; // 由于是 [left,right) 区间,left 的位置可选,而 mid 此时已不满足要求,因此不能把 mid 加入到下一次搜索中
}
else
{
return mid; // 找到了目标值
}
}
return -1; // 没找到目标值
}