Leetcode刷题详解——猜数字大小 II

1. 题目链接:375. 猜数字大小 II

2. 题目描述:

我们正在玩一个猜数游戏,游戏规则如下:

  1. 我从 1n 之间选择一个数字。
  2. 你来猜我选了哪个数字。
  3. 如果你猜到正确的数字,就会 赢得游戏
  4. 如果你猜错了,那么我会告诉你,我选的数字比你的 更大或者更小 ,并且你需要继续猜数。
  5. 每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。如果你花光了钱,就会 输掉游戏

给你一个特定的数字 n ,返回能够 确保你获胜 的最小现金数,不管我选择那个数字

示例 1:

请添加图片描述

输入:n = 10
输出:16
解释:制胜策略如下:
- 数字范围是 [1,10] 。你先猜测数字为 7 。
    - 如果这是我选中的数字,你的总费用为 $0 。否则,你需要支付 $7 。
    - 如果我的数字更大,则下一步需要猜测的数字范围是 [8,10] 。你可以猜测数字为 9 。
        - 如果这是我选中的数字,你的总费用为 $7 。否则,你需要支付 $9 。
        - 如果我的数字更大,那么这个数字一定是 10 。你猜测数字为 10 并赢得游戏,总费用为 $7 + $9 = $16 。
        - 如果我的数字更小,那么这个数字一定是 8 。你猜测数字为 8 并赢得游戏,总费用为 $7 + $9 = $16 。
    - 如果我的数字更小,则下一步需要猜测的数字范围是 [1,6] 。你可以猜测数字为 3 。
        - 如果这是我选中的数字,你的总费用为 $7 。否则,你需要支付 $3 。
        - 如果我的数字更大,则下一步需要猜测的数字范围是 [4,6] 。你可以猜测数字为 5 。
            - 如果这是我选中的数字,你的总费用为 $7 + $3 = $10 。否则,你需要支付 $5 。
            - 如果我的数字更大,那么这个数字一定是 6 。你猜测数字为 6 并赢得游戏,总费用为 $7 + $3 + $5 = $15 。
            - 如果我的数字更小,那么这个数字一定是 4 。你猜测数字为 4 并赢得游戏,总费用为 $7 + $3 + $5 = $15 。
        - 如果我的数字更小,则下一步需要猜测的数字范围是 [1,2] 。你可以猜测数字为 1 。
            - 如果这是我选中的数字,你的总费用为 $7 + $3 = $10 。否则,你需要支付 $1 。
            - 如果我的数字更大,那么这个数字一定是 2 。你猜测数字为 2 并赢得游戏,总费用为 $7 + $3 + $1 = $11 。
在最糟糕的情况下,你需要支付 $16 。因此,你只需要 $16 就可以确保自己赢得游戏。

示例 2:

输入:n = 1
输出:0
解释:只有一个可能的数字,所以你可以直接猜 1 并赢得游戏,无需支付任何费用。

示例 3:

输入:n = 2
输出:1
解释:有两个可能的数字 1 和 2 。
- 你可以先猜 1 。
    - 如果这是我选中的数字,你的总费用为 $0 。否则,你需要支付 $1 。
    - 如果我的数字更大,那么这个数字一定是 2 。你猜测数字为 2 并赢得游戏,总费用为 $1 。
最糟糕的情况下,你需要支付 $1 。

提示:

  • 1 <= n <= 200

3. 解法(记忆化搜索):

3.1 算法思路:

  1. 一个备忘录
  2. 每次进入递归的时候,去备忘录里面看看
  3. 每次返回的时候,将结果加入到备忘录里面

3.2算法流程:

  1. 定义一个二维数组memo,用于存储已经计算过的子问题的解。这个数组的大小为201x201,其中memo[i][j]表示从第i个硬币到第j个硬币的最小翻转代价。
  2. 定义一个函数getMoneyAmount(int n),接收一个整数参数n,表示硬币的数量。这个函数的作用是调用dfs(1, n)来计算从第一个硬币到第n个硬币的最小翻转代价,并返回结果。
  3. 定义一个函数dfs(int left, int right),接收两个整数参数leftright,表示要计算的硬币范围。这个函数的作用是递归地计算从第left个硬币到第right个硬币的最小翻转代价。
  4. dfs(int left, int right)函数中,首先检查是否已经计算过从第left个硬币到第right个硬币的最小翻转代价。如果已经计算过,则直接返回该解。
  5. 如果还没有计算过,则初始化一个变量ret为最大整数。然后遍历从第left个硬币到第right个硬币的所有可能的硬币翻转位置。对于每个位置head,分别计算翻转前半部分和翻转后半部分的最小代价,并将它们相加得到当前位置的翻转代价。将这个代价与当前的ret进行比较,更新ret为较小的值。
  6. 将计算出的最小翻转代价存入memo数组中,以便后续使用。
  7. 最后,返回计算出的最小翻转代价。
    请添加图片描述

3.3 C++算法代码:

class Solution {
    int memo[201][201]; // 定义一个二维数组memo,用于存储已经计算过的子问题的解
public:
    int getMoneyAmount(int n) {
        return dfs(1,n); // 调用dfs函数,传入参数1和n,返回结果
    }
    int dfs(int left,int right) // 定义一个dfs函数,接收两个参数left和right
    {
        if(left>=right) return 0; // 如果left大于等于right,说明已经没有硬币可以翻转了,返回0
        if(memo[left][right]!=0) return memo[left][right]; // 如果memo数组中已经存在left到right的解,直接返回该解
        int ret=INT_MAX; // 初始化ret为最大整数
        for(int head=left;head<=right;head++) // 遍历从left到right的所有可能的硬币翻转位置
        {
            int x=dfs(left,head-1); // 递归调用dfs函数,传入参数left和head-1,得到翻转前半部分的最小代价
            int y=dfs(head+1,right); // 递归调用dfs函数,传入参数head+1和right,得到翻转后半部分的最小代价
            ret=min(ret,head+max(x,y)); // 更新ret为当前位置翻转的代价加上翻转前后两部分的最小代价
        }
        memo[left][right]=ret; // 将计算出的解存入memo数组
        return ret; // 返回解
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/158945.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装 eslint 配置指南 及 遇到的一些问题记录

前端eslint配置指南 背景 当前前端项目风格混乱&#xff0c;每个人有自己的开发习惯&#xff0c;有自己的格式化习惯&#xff0c;不便于项目的风格统一&#xff0c;不利于代码维护有的项目eslint没有用起来&#xff0c;没有起到规范代码的作用&#xff0c;导致出现一些基础代码…

基于数据库(MySQL)与缓存(Redis)实现分布式锁

分布式锁 分布式锁&#xff1a;分布式锁是在分布式的情况下实现互斥类型的一种锁 实现分布式锁需要满足的五个条件 可见性&#xff1a;多个进程都能看到结果互斥性&#xff1a;只允许一个持有锁的对象的进入临界资源可用性&#xff1a;无论何时都要保证锁服务的可用性&#x…

刷题学习记录(攻防世界)

wife_wife 一拿到题目就提示这题不用爆破 进入环境得到的是一个登录框 随便试了一下登录账户密码会提示错误&#xff0c;那就去注册账户&#xff0c;注册的账户还有注册管理员的选项 先注册普通用户234&#xff0c;注册好后登录 这样就得到flag&#xff0c;但是提交是错误的&a…

智能井盖传感器能不能监测井盖位移

智能井盖传感器能够精准监测井盖的位移。这些传感器运用了前沿科技对井盖状态进行实时监测。一旦井盖出现异常移动传感器会立即捕捉到信号&#xff0c;并通过与互联网相连接的智能系统发出警报或记录数据。这种智能监测仪为城市或相关部门的井盖管理提供了实时数据支持&#xf…

Matlab通信仿真系列——信号处理函数

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、Matlab信号产生函数…

Python网络编程多线程实现异步服务端

在《Python中通过socketserver库创建服务端》中提到的使用socketserver库创建的服务端是同步服务端。当有多个客户端接入服务端时&#xff0c;必须接收了客户端A发送的数据之后&#xff0c;才会再接收客户端B的服务端。而如果客户端A连接服务端后&#xff0c;没有发送数据&…

三菱FX3U小项目—运料小车自动化

目录 一、项目描述 二、IO口分配 三、项目流程图 四、项目程序 五、总结 一、项目描述 设备如下图所示&#xff0c;其中启动按钮SB1用来开启运料小车&#xff0c;停止按钮SB2用来手动停止运料小车(其工作方式任务模式要求)。当小车在原点SQ1位置&#xff0c;按下启动按钮S…

RocketMQ(三):集成SpringBoot

RocketMQ系列文章 RocketMQ(一)&#xff1a;基本概念和环境搭建 RocketMQ(二)&#xff1a;原生API快速入门 RocketMQ(三)&#xff1a;集成SpringBoot 目录 一、搭建环境二、不同类型消息1、同步消息2、异步消息3、单向消息4、延迟消息5、顺序消息6、带tag消息7、带key消息 一…

关于python中内存分配的问题,运行一些操作可能会导致为新结果分配内存,用Python的id()函数演示

一、考虑背景&#xff1a; 一般在python中不会考虑像C中的内存问题&#xff0c;但是在一些高级应用中会考虑&#xff0c;例如有一个特别特别大的矩阵&#xff0c;最好不要不断的赋值&#xff0c;导致内存问题产生。 二、python中的id&#xff1a; 在python中有个id&#xff…

内网渗透之信息收集

目录 本机信息收集 查看系统配置信息 查看系统服务信息 查看系统登录信息 自动信息收集 域内信息收集 判断是否存在域 本机信息收集 查看系统配置信息 查看系统服务信息 查看系统登录信息 自动信息收集 域内信息收集 查看机器相关信息 查看用户相关信息 powershel…

【Java 进阶篇】深入浅出:JQuery 事件绑定的奇妙世界

在前端的世界里&#xff0c;事件是不可或缺的一部分。用户的点击、输入、滚动等行为都触发着各种事件&#xff0c;而如何在代码中捕捉并处理这些事件是每位前端开发者必须掌握的技能之一。本文将带你深入浅出&#xff0c;探索 JQuery 中的事件绑定&#xff0c;为你揭开这个奇妙…

ke11..--2其他界面也要提取我的locatStarage

获取浏览器里面的本地缓存 localStorage就是我们的浏览器缓存在哪都可以用 下面代码是获取打印到我们的页面上 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> …

【杂谈】-蓝牙低功耗数据传输模式比较

蓝牙低功耗数据传输模式比较 文章目录 蓝牙低功耗数据传输模式比较1、无连接数据传输2、无连接数据传输的优点3、无连接数据传输的局限性 3、面向连接的数据传输4、面向连接模式的优点5、面向连接模式的局限性6、家庭自动化项目的性能观察 物联网&#xff08;IoT&#xff09;设…

端口映射软件

今天给大家介绍一个自己制作的工具&#xff0c;本工具可以把本地自己的项目映射到外网可以访问,自己有域名可以使用自己的,没有可以用软件自带的三级域名! Token获取 地址&#xff1a;传送 打开上面网址注册账号&#xff0c;然后点击验证&#xff0c;复制里面的值即可。 软件…

报错:HikariPool-1 - Exception during pool initialization.

问题发现&#xff1a; 原本可以运行的springboot2项目突然无法运行且报错&#xff0c;HikariPool-1 - Exception during pool initialization。 问题分析&#xff1a; 观察报错信息发现是JDBC连接失败&#xff0c;进而搜索HikariPool-1&#xff0c;搜索得知应该是applicatio…

为什么鸿蒙调用弹窗组件(CommonDialog )却不展示或闪退?

鸿蒙OS开发问题 1.效果展示2.问题代码3.问题分析4.完整代码 1.效果展示 1.为什么调用弹窗不展示会闪退? 2.问题代码 1.前端代码: <?xml version"1.0" encoding"utf-8"?> <DirectionalLayoutxmlns:ohos"http://schemas.huawei.com/res/…

01线性回归

目录 常规求解&#xff1a; 矩阵求解 sklean算法求解 # 二元一次方程 # x y 14 # 2x - y 10 常规求解&#xff1a; x np.array([[1,1],[2,-1]])print(x) # [[ 1 1] # [ 2 -1]]y np.array([14, 10])w np.linalg.solve(x, y)print(正常求救&#xff1a;)print(w) …

契约锁助力货物进出口全程无纸化,加速通关、降低贸易成本

我国作为全球最大的制造业国家和最大的货物贸易国家&#xff0c;政府始终注重引入数字化技术&#xff0c;创新管理和服务模式&#xff0c;帮助降低企业进出口成本&#xff0c;加速货物流通。 近年国家海关总署、商务部、税务总局及各地政府在进出口“报关”、“提货”、“收货备…

Redis持久化策略之RDB与AOF

文章目录 1.RDB1)基本介绍2)自动触发3)手动触发4)RDB文件5)优点缺点 2.AOF1)基本介绍2)使用方式3)工作流程4)重写机制5)AOF文件6)优点缺点 3.RDB AOF 我们都知道&#xff0c;redis 是一个基于内存的数据库。基于内存的好处是访问速度快&#xff0c;缺点是“不持久”——当数据…

golang标准库-crc32的使用

1.概述 crc32实现了32位循环冗余检测算法的实现。目前crc32内部提供 了三种常用的多项式,采用查表法来提高计算checksum的效率。通过crc32.MakeTable()可以获取对应的表&#xff0c;crc32提供了一个IEETABLE可以直接使用&#xff0c;官方链接如下&#xff1a;crc32 package - h…