LeetCode算法题(Go语言实现)_53

题目

我们正在玩猜数字游戏。猜数字游戏的规则如下:
我会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
如果你猜错了,我会告诉你,我选出的数字比你猜测的数字大了还是小了。
你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有三种可能的情况:
-1:你猜的数字比我选出的数字大 (即 num > pick)。
1:你猜的数字比我选出的数字小 (即 num < pick)。
0:你猜的数字与我选出的数字相等。(即 num == pick)。
返回我选出的数字。

一、代码实现(Go语言实现)

func guessNumber(n int) int {
    left, right := 1, n
    for left <= right {
        mid := left + (right - left)/2
        switch guess(mid) {
        case 0:
            return mid
        case -1:
            right = mid -1
        case 1:
            left = mid +1
        }
    }
    return -1
}

二、算法分析

1. 核心思路
  • 二分查找:利用有序特性每次将搜索范围缩小一半
  • 三态判断:根据guess返回值调整搜索区间
  • 防溢出处理:使用安全中间值计算方式
2. 关键步骤
  1. 初始化边界:左边界left=1,右边界right=n
  2. 循环条件:left <= right确保搜索完整性
  3. 中间值计算:mid = left + (right-left)//2
  4. 动态调整区间:
    • 猜中时直接返回
    • 猜测值大时收缩右边界
    • 猜测值小时扩展左边界
3. 复杂度
指标说明
时间复杂度O(log n)每次缩小一半搜索范围
空间复杂度O(1)仅需维护边界指针

三、图解示例

在这里插入图片描述

四、边界条件与扩展

1. 特殊场景验证
  • 最小规模:n=1时直接返回1
  • 最大边界:n=2^31-1时正确计算中间值
  • 连续错误方向:确保区间能正确收敛
2. 扩展应用
  • 自定义猜测策略:动态调整猜测方向
  • 错误猜测统计:记录错误猜测次数
  • 分布式猜测:多节点并行猜测不同区间
3. 多语言实现
public class Solution extends GuessGame {
    public int guessNumber(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;
            else if (res == -1) right = mid - 1;
            else left = mid + 1;
        }
        return -1;
    }
}
def guessNumber(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 - 1
        else:
            left = mid + 1
    return -1  # 理论上不可达

五、总结与优化

1. 算法对比
方法优势适用场景
二分查找最优时间复杂度有序数据范围
三分查找减少迭代次数特定分布数据
随机猜测避免最坏情况对抗性输入场景
2. 工程优化
  • 循环展开:手动展开循环减少分支判断
  • 预计算偏移量:使用位运算加速除法
  • 缓存优化:优化内存访问模式
3. 扩展方向
  • 区间跳跃:根据历史猜测动态调整步长
  • 机器学习预测:基于历史数据优化猜测路径
  • 容错处理:处理存在错误反馈的情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值