题目描述
题解
循环中的条件是left < = right,此时条件为左闭右闭区间,right的值会被取到right应赋值为numsSize - 1,已匹配数组中最后一位元素的下标。
int search(int* nums, int numsSize, int target) {
// 'nums' 是指向数组第一个元素的指针。
// 'numsSize' 是数组中元素的数量。
// 'target' 是需要在数组中查找的目标值。
int left = 0; // 定义左边界为数组的起始位置。
int right = numsSize - 1; // 定义右边界为数组的结束位置。
// 当左边界不大于右边界时,执行循环。
while (left <= right) {
int mid = left + (right - left) / 2; // 计算中间位置的索引。
// 避免(left + right)可能导致的整数溢出。
// 如果中间位置的元素等于目标值,则返回当前的中间位置索引。
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
// 如果中间位置的元素小于目标值,说明目标值在数组中间位置的右侧。
// 因此,将左边界移动到中间位置的右边一个位置。
left = mid + 1;
} else {
// 如果中间位置的元素大于目标值,说明目标值在数组中间位置的左侧。
// 因此,将右边界移动到中间位置的左边一个位置。
right = mid - 1;
}
}
// 如果循环结束后没有找到目标值,返回 -1。
return -1;
}
循环中的条件是left <right。
int search(int* nums, int numsSize, int target) {
int left = 0;
int right = numsSize; // 注意这里不再是 numsSize - 1
while (left < right) { // 循环条件现在是 left < right
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid; // 找到目标直接返回索引
} else if (nums[mid] < target) {
left = mid + 1; // 目标在中点右侧
} else {
right = mid; // 目标在中点左侧或者是中点,注意这里不再是 mid - 1
}
}
// 循环结束后,如果目标元素是数组中最后一个元素,那么 left == right == numsSize - 1
// 但此时还没有检查 nums[left] 是否等于 target
// 所以需要额外检查一次
if (left < numsSize && nums[left] == target) {
return left;
}
return -1; // 如果没有找到目标,返回 -1
}