start起点为0 无可探讨。
end
左闭右开时,即不考虑nums[end]
的值为目标值的时候
选 nums.size() 具体判断条件为 start < end
左闭右闭时,即考虑nums[end]
的值为目标值的时候
选 nums.size() - 1 具体判断条件为 start <= end
扩展 当存在多个目标值时
寻找最右边的值
int searchRight(vector<int>& nums, int target) {
int start = 0;
int end = nums.size();
while (start < end) {
int mid = start + (end - start) / 2;
if (nums[mid] > target) {
end = mid; // 目标在mid左侧
} else { // nums[mid] <= target
start = mid + 1; // 目标在mid右侧
}
}
// 检查是否找到了目标
if (start > 0 && nums[start - 1] == target) {
return start - 1; // 返回最右目标位置
}
return -1; // 未找到目标
}
寻找最左边的值
int searchLeft(std::vector<int>& nums, int target) {
int start = 0;
int end = nums.size();
while (start < end) {
int mid = start + (end - start) / 2;
if (nums[mid] < target) {
start = mid + 1; // 目标在mid右侧位置
} else {
end = mid; // nums[mid] >= target,目标可能在mid左侧或mid本身
}
}
// 检查是否找到了目标
if (start < nums.size() && nums[start] == target) {
return start; // 返回最左目标位置
}
return -1; // 未找到目标
}