力扣第374题 猜数字大小

题目

374. 猜数字大小

简单

猜数字游戏的规则如下:

  • 每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
  • 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。

你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-11 或 0):

  • -1:我选出的数字比你猜的数字小 pick < num
  • 1:我选出的数字比你猜的数字大 pick > num
  • 0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num

返回我选出的数字。

示例 1:

输入:n = 10, pick = 6
输出:6

示例 2:

输入:n = 1, pick = 1
输出:1

示例 3:

输入:n = 2, pick = 1
输出:1

示例 4:

输入:n = 2, pick = 2
输出:2

提示:

  • 1 <= n <= 231 - 1
  • 1 <= pick <= n

思路和解题方法

这是一个经典的猜数字游戏,我们需要根据给定的 guess() 函数来猜测选出的数字。

一种常见的解法是使用二分查找的思想来逼近目标数字。

  1. 定义两个指针 left 和 right,分别指向 1 和 n。
  2. 在每一轮中,我们将猜测的数字设为 mid,其中 mid = (left + right) / 2
  3. 调用 guess(mid) 函数来获取猜测结果。
    • 如果返回值为 0,说明猜对了,直接返回 mid
    • 如果返回值为 1,说明目标数字比 mid 大,因此更新 left = mid + 1
    • 如果返回值为 -1,说明目标数字比 mid 小,因此更新 right = mid - 1
  4. 继续进行下一轮猜测,直到找到目标数字为止。

复杂度

        时间复杂度:

                O(log n)

时间复杂度是 O(log n),其中 n 是给定的范围。每次都将搜索范围缩小一半,直到找到目标数字。

        空间复杂度

                O(1)

空间复杂度是 O(1),因为只使用了几个额外的变量来保存左右指针和中间值,而不依赖于输入规模。因此,该解法的空间复杂度是常数级别的,与输入规模无关。

c++ 代码

 ​
class Solution {
public:
    int guessNumber(int n) {
        int left = 1, right = n;  // 初始化左右边界,范围为 1 到 n
        while(left < right) {  // 当左边界小于右边界时进行循环
            int mid = left + (right - left) / 2;  // 计算中间值,避免溢出
            if (guess(mid) <= 0)  // 调用 guess() 函数猜测中间值的结果
                right = mid;  // 如果猜测结果小于等于 0,说明猜对了或者目标数字比中间值小,缩小右边界
            else 
                left = mid + 1;  // 如果猜测结果大于 0,说明目标数字比中间值大,缩小左边界
        }
        return left;  // 返回左边界作为选出的数字(此时左右边界相等)
    }
};

posted @   lenyan~  阅读(16)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示