375. 猜数字大小 II

232 阅读2分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战」。

题目

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

我从 1 到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字,就会 赢得游戏 。 如果你猜错了,那么我会告诉你,我选的数字比你的 更大或者更小 ,并且你需要继续猜数。 每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。如果你花光了钱,就会 输掉游戏 。 给你一个特定的数字 n ,返回能够 确保你获胜 的最小现金数,不管我选择那个数字 。

截屏2021-11-12 下午9.06.54.png

示例1

输入: n = 10
输出: 16

思路分析

啊听起来就是一个深度优先搜索或者广度优先搜索算出每条路径的金额的最大值,然后返回这个结果。

听上去很简单,实现也不难。这篇文章就不写代码了,想看dfs的可以翻一下往期文章。下面稍微介绍下为什么dfs是最优解。

对于1-10任意值,比如说6,使用二分查找的方式会成为最优解么?

不会,你直接猜6是最快最省的

但是如果对于不管我选择那个数字,那你就要有一个整体的方案,直接猜6错误以后猜什么,这个时候最优解就是二分查找了。

因为,他的查找路径,也可以理解为一个二分查找树是最平衡的。

那么为什么要返回路径最大值呢?

因为如果是最小值的话相当于无法满足其他所有路径(叶子结点)。因此只有最大值才能满足所有的路径。