我们正在玩猜数字游戏。猜数字游戏的规则如下: 我会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。 如果你猜错了,我会告诉你,我选出的数字比你猜测的数字大了还是小了。 你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有三种可能的情况: -1:你猜的数字比我选出的数字大 (即 num > pick)。 1:你猜的数字比我选出的数字小 (即 num < pick)。 0:你猜的数字与我选出的数字相等。(即 num == pick)。 返回我选出的数字。
一、代码实现(Go语言实现)
funcguessNumber(n int)int{
left, right :=1, n
for left <= right {
mid := left +(right - left)/2switchguess(mid){case0:return mid
case-1:
right = mid -1case1:
left = mid +1}}return-1}
二、算法分析
1. 核心思路
二分查找:利用有序特性每次将搜索范围缩小一半
三态判断:根据guess返回值调整搜索区间
防溢出处理:使用安全中间值计算方式
2. 关键步骤
初始化边界:左边界left=1,右边界right=n
循环条件:left <= right确保搜索完整性
中间值计算:mid = left + (right-left)//2
动态调整区间:
猜中时直接返回
猜测值大时收缩右边界
猜测值小时扩展左边界
3. 复杂度
指标
值
说明
时间复杂度
O(log n)
每次缩小一半搜索范围
空间复杂度
O(1)
仅需维护边界指针
三、图解示例
四、边界条件与扩展
1. 特殊场景验证
最小规模:n=1时直接返回1
最大边界:n=2^31-1时正确计算中间值
连续错误方向:确保区间能正确收敛
2. 扩展应用
自定义猜测策略:动态调整猜测方向
错误猜测统计:记录错误猜测次数
分布式猜测:多节点并行猜测不同区间
3. 多语言实现
publicclassSolutionextendsGuessGame{publicintguessNumber(int n){int left =1, right = n;while(left <= right){int mid = left +(right - left)/2;int res =guess(mid);if(res ==0)return mid;elseif(res ==-1) right = mid -1;else left = mid +1;}return-1;}}
defguessNumber(n:int)->int:
left, right =1, n
while left <= right:
mid = left +(right - left)//2
res = guess(mid)if res ==0:return mid
elif res ==-1:
right = mid -1else:
left = mid +1return-1# 理论上不可达