public int guessNumber(int n) {
// 中间指针
int mid = 0;
// 左指针
int left = 0;
// 右指针
int right = n;
// 循环执行
while (right > left) {
mid = 0;
// 获取中间指针, 左指针和中间指针都不能被2整除的时候, 中间指针需要加1
// 例如: 左指针为3 右指针为5 那么得到的中间指针应该是 (3+5)/2 = 4, 但是两个数字相加会超过最大值, 因此需要单独计算/2
// 所以3/2 = 1, 5/2 = 2, 得到的结果是3, 因此最后的结果需要+1
if (left % 2 != 0 && right % 2 != 0) {
mid += left / 2 + right / 2 + 1;
} else {
mid += left / 2 + right / 2;
}
int guess = guess(mid);
if (guess == 0) {
break;
}
if (guess == -1) {
// 当前需要判断一下左指针是否就是右指针,避免出现死循环,存在指针数据就是目标数据的可能
if (right == mid && guess(left) == 0) {
return left;
}
// 当猜的数字大于目标数字, 所以当猜的数字就是右指针
right = mid;
}
if (guess == 1) {
if (left == mid && guess(right) == 0) {
return right;
}
left = mid;
}
}
return mid;
}
374. 猜数字大小
该博客详细解析了一个猜数字游戏的二分查找算法实现。在循环执行中,通过不断调整左指针和右指针,寻找目标数值。特别地,针对左指针和右指针都不能被2整除的情况进行了优化,确保中间指针的正确计算。当猜的数字大于目标时,右指针更新为中间指针;反之,左指针更新。最后返回中间指针作为结果。
摘要由CSDN通过智能技术生成