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的更多相关文章

  1. Leetcode 375.猜数字大小II

    猜数字大小II 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字. 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了. 然而,当你猜了数字 x ...

  2. Java实现 LeetCode 374 猜数字大小 II

    375. 猜数字大小 II 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字. 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了. 然而,当你猜 ...

  3. [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 ...

  4. 375. 猜数字大小 II leetcode java

    题目: 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字. 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了. 然而,当你猜了数字 x 并且猜错 ...

  5. 375 Guess Number Higher or Lower II 猜数字大小 II

    我们正在玩一个猜数游戏,游戏规则如下:我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字.每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了.然而,当你猜了数字 x 并且猜错了的时候,你需 ...

  6. [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 ...

  7. 375. 猜数字大小 II

    题目: 链接:https://leetcode-cn.com/problems/guess-number-higher-or-lower-ii/ 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 ...

  8. 详解LeetCode 137. Single Number II

    Given an array of integers, every element appears three times except for one, which appears exactly ...

  9. Leetcode之二分法专题-374. 猜数字大小(374. Guess Number Higher or Lower)

    Leetcode之二分法专题-374. 猜数字大小(374. Guess Number Higher or Lower) 我们正在玩一个猜数字游戏. 游戏规则如下:我从 1 到 n 选择一个数字. 你 ...

随机推荐

  1. python中的新式类与旧式类

    在python2中,有新式类与旧式类的区别: 首先创建一个类: class Sb(object): pass 如果创建时继承自object,说明这是一个新式类,不写object,说明是一个旧式类: 那 ...

  2. Python入门:Anaconda和Pycharm的安装和配置

    Python入门:Anaconda和Pycharm的安装和配置  转自:https://www.cnblogs.com/yuxuefeng/articles/9235431.html 子曰:“工欲善其 ...

  3. maven学习-基本入门用法

    一.下载及安装 1.1 下载maven 3.1.1 先到官网http://maven.apache.org/download.cgi 下载最新版本(目前是3.1.1 ),下载完成后,解压到某个目录(本 ...

  4. 2017-09-16 ADB Shell+Putty

    鼓捣电子词典的时候需要用到ADB Shell.一开始是用cmd.exe,结果发现它不能识别ANSI转义符,就换成了Putty,然后就可以正常使用了,还有彩色. 配置如下: Connection Typ ...

  5. week07 13.4 NewsPipeline之 三 News Deduper

    还是循环将Q2中的东西拿出来 然后查重(去mongodb里面把一天之内的新闻都拿出来,然后把拿到的新的新闻和mongodb里一天内的新闻组一个 tf-idf的对比)可看13.3 相似度检查 如果超过一 ...

  6. Linux下,如何查看磁盘是否包含数据

    可以使用lquerypv -h来查看磁盘是否包含数据,或磁盘头是否被dd过.这在安装RAC的过程中,是非常实用的一个命令.如果不包括数据的话,那么如下所示: [ZFFR4CB2101:root]/]& ...

  7. const命令声明变量应注意的几点

    对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址.const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心. const person = ...

  8. Spring使用fastjson处理json数据

    1.搭建SpringMVC+spring环境 2.配置web.xml以及springmvc-config.xml,web.xml同Spring使用jackson处理json数据一样,Springmvc ...

  9. 十八、Memento 备忘录设计模式

    原理: 代码清单: Memento public class Memento { int mondey; ArrayList fruits; Memento(int mondey){ this.mon ...

  10. as3.0 嵌入字体的用法

    var txt:TextField = new TextField();//创建文本 txt.embedFonts=true;//确定嵌入字体 var font:Font=new MyFont();/ ...