详解 leetcode 猜数字大小 II
375. 猜数字大小 II
原题链接375. 猜数字大小 II
题目下方给出了几个提示:
- 游戏的最佳策略是减少最大损失,这引出了 Minimax 算法,见这里,和这里
- 使用较小的数开始(例如3),看看在最差的情况下你要支付多少钱?
- 即使 n 比较小,完全使用递归的效率也很低,试试动态规划吧。
我们就按照上面的提示玩一把:猜数字大小 II。
当 n = 3,那么我们有 3 个选择:1 或 2 或 3。
假设我们先猜 1,就有两种情况:
- [猜对]:1 就是正确的数字,所以你支付 0¥,或者
- [猜错]:1 不是正确数字,于是你需要支付 1¥(现在,你知道那个正确的数字 > 1,因为每次猜完后你都将被告知猜大了还是猜小了。但就目前的情况来看正确的那个数肯定比 1 大),于是我们得到了一个子问题(2,3)——在[2,3]范围内猜出正确的数字。运用递归,我们可以使用同样的方法解决这个问题,此时你可以选择 2 或 3。如果选择 2,你又有两个可能的结果:2 是正确的数字于是你支付 0¥,或者 2 不是正确的数字那么你支付 2¥ ,现在你知道正确的数字是 3 了(因为只剩下 3 这个数字)。如果选择 3,要么 3 就是正解要么你支付 3¥ 于是你知道 2 才是正确的答案。总结一下,选择 2 最多支付 2¥,选择 3 最多支付 3¥。两相比较,在支付最多的情况下,我们选择那个最小的值(2¥),即数字 2 作为子问题(2,3)的答案。(注意到 minimax 了么~~)所以,最终的花费是 1¥ + 2¥ = 3¥
如果你最先猜的是 2,同样会有两个可能的结果:
- 2 是正确的数字,你支付 0¥
- 2 不是正确的数字,你支付 2¥。此时,你会知道你猜大还是猜小了,于是你马上就知道哪个才是正确答案了。所以,如果你最先猜 2,你最多支付 2¥。
同样的,如果你最先猜 3,那么你最多需要花费 4¥。
所以,最先猜 2 才是最优选择,你最多花费 2¥。
参考下面的代码,你会看到这是一个十分自然的递归过程。(使用了二维矩阵缓存结果)
public class Solution {
private int[][]dp;
private int solve(int l, int r) {
if (l >= r) return 0;
// 说明 dp[l][r] 已经被计算过了,直接返回
if (dp[l][r] != Integer.MAX_VALUE) return dp[l][r];
for (int i = l; i <= r; ++i) {
dp[l][r] = Math.min(dp[l][r], Math.max(i + solve(l, i-1), i + solve(i+1, r)));
}
return dp[l][r];
}
public int getMoneyAmount(int n) {
dp = new int[n+1][n+1];
for (int[] row : dp)
Arrays.fill(row, Integer.MAX_VALUE);
return solve(1, n);
}
}
原文链接:https://harunscorner.wordpress.com/2016/09/04/leetcode-guess-number-higher-or-lower-ii-solution/
参考:http://www.cnblogs.com/grandyang/p/5677550.html
详解 leetcode 猜数字大小 II的更多相关文章
- Leetcode 375.猜数字大小II
猜数字大小II 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字. 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了. 然而,当你猜了数字 x ...
- Java实现 LeetCode 374 猜数字大小 II
375. 猜数字大小 II 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字. 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了. 然而,当你猜 ...
- [LeetCode] 375. Guess Number Higher or Lower II 猜数字大小 II
We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...
- 375. 猜数字大小 II leetcode java
题目: 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字. 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了. 然而,当你猜了数字 x 并且猜错 ...
- 375 Guess Number Higher or Lower II 猜数字大小 II
我们正在玩一个猜数游戏,游戏规则如下:我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字.每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了.然而,当你猜了数字 x 并且猜错了的时候,你需 ...
- [Swift]LeetCode375. 猜数字大小 II | Guess Number Higher or Lower II
We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...
- 375. 猜数字大小 II
题目: 链接:https://leetcode-cn.com/problems/guess-number-higher-or-lower-ii/ 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 ...
- 详解LeetCode 137. Single Number II
Given an array of integers, every element appears three times except for one, which appears exactly ...
- Leetcode之二分法专题-374. 猜数字大小(374. Guess Number Higher or Lower)
Leetcode之二分法专题-374. 猜数字大小(374. Guess Number Higher or Lower) 我们正在玩一个猜数字游戏. 游戏规则如下:我从 1 到 n 选择一个数字. 你 ...
随机推荐
- 【392】Python 列表解析
参考: Python3 数据结构 | 菜鸟教程 列表推导式 列表推导式提供了从序列创建列表的简单途径.通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的 ...
- ps命令详解
1.简介: ps 命令有两种不同的语法风格 —— BSD 与 UNIX 两种风格.新手常常对这两种形式产生误解,因此我们有必要在这里作一个简单的说明: ps aux 与 ps -aux 是不同的,例如 ...
- 《深入理解JAVA虚拟机》----------第二章 JAVA内存区域与内存溢出异常,笔记(下)
2. HotSpot虚拟机对象探秘 2.1 对象的创建 虚拟机遇到一条New指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初 ...
- win10版office365激活序列码
win10版office365激活序列码(在别的地方找到一个) : NKGG6-WBPCC-HXWMY-6DQGJ-CPQVG 1.在线安装Office2016预览版后它是不会自动激活的,需在Offi ...
- mysql,utf8,utf8mb4
参考文章 https://www.cnblogs.com/beyang/p/7580814.html https://blog.csdn.net/testcs_dn/article/details/7 ...
- Oracle一次Insert多条数据
insert all into JK_TB_DATE (fbmmc,fgzjh,fsbmc,fsbxh,fsbbh,db_shuifenyi,db_pihao,db_wuliaobianma) ',' ...
- Java学习笔记(二十二):打包程序
加入一个程序测试完毕,我们就可以将它打包,就可以放到服务器上运行了 找到左下角的终端 点击 输入命令: mvnw clean package -DskipTests=true clean:清除以前生成 ...
- sh 了解
shell 脚本中 `dirname $0` 在命令行状态下单纯的执行时没有意义的,因为他返回当前路径的“.”. 在脚本中他返回这个脚本文件放置的目录,并可以根据这个目录来定位所要运行的程序的相对位置 ...
- 关于TP5.0搜索后分页
使用$Model->where($where)->paginate($page,$count);的时候如果点击下一页会出现条件重置问题,经过测试可以使用Db::name('data') - ...
- 365. Water and Jug Problem量杯灌水问题
[抄题]: 简而言之:只能对 杯子中全部的水/容量-杯子中全部的水进行操作 You are given two jugs with capacities x and y litres. There i ...