【LeetCode】375. Guess Number Higher or Lower II 猜数字大小 II(Medium)(JAVA)
题目地址: https://leetcode.com/problems/guess-number-higher-or-lower-ii/
题目描述:
We are playing the Guessing Game. The game will work as follows:
- I pick a number between 1 and n.
- You guess a number.
- If you guess the right number, you win the game.
- If you guess the wrong number, then I will tell you whether the number I picked is higher or lower, and you will continue guessing.
- Every time you guess a wrong number x, you will pay x dollars. If you run out of money, you lose the game.
Given a particular n, return the minimum amount of money you need to guarantee a win regardless of what number I pick.
Example 1:
Input: n = 10
Output: 16
Explanation: The winning strategy is as follows:
- The range is [1,10]. Guess 7.
- If this is my number, your total is $0. Otherwise, you pay $7.
- If my number is higher, the range is [8,10]. Guess 9.
- If this is my number, your total is $7. Otherwise, you pay $9.
- If my number is higher, it must be 10. Guess 10. Your total is $7 + $9 = $16.
- If my number is lower, it must be 8. Guess 8. Your total is $7 + $9 = $16.
- If my number is lower, the range is [1,6]. Guess 3.
- If this is my number, your total is $7. Otherwise, you pay $3.
- If my number is higher, the range is [4,6]. Guess 5.
- If this is my number, your total is $7 + $3 = $10. Otherwise, you pay $5.
- If my number is higher, it must be 6. Guess 6. Your total is $7 + $3 + $5 = $15.
- If my number is lower, it must be 4. Guess 4. Your total is $7 + $3 + $5 = $15.
- If my number is lower, the range is [1,2]. Guess 1.
- If this is my number, your total is $7 + $3 = $10. Otherwise, you pay $1.
- If my number is higher, it must be 2. Guess 2. Your total is $7 + $3 + $1 = $11.
The worst case in all these scenarios is that you pay $16. Hence, you only need $16 to guarantee a win.
Example 2:
Input: n = 1
Output: 0
Explanation: There is only one possible number, so you can guess 1 and not have to pay anything.
Example 3:
Input: n = 2
Output: 1
Explanation: There are two possible numbers, 1 and 2.
- Guess 1.
- If this is my number, your total is $0. Otherwise, you pay $1.
- If my number is higher, it must be 2. Guess 2. Your total is $1.
The worst case is that you pay $1.
Constraints:
- 1 <= n <= 200
题目大意
我们正在玩一个猜数游戏,游戏规则如下:
我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字。
每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了。
然而,当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。直到你猜到我选的数字,你才算赢得了这个游戏。
给定 n ≥ 1,计算你至少需要拥有多少现金才能确保你能赢得这个游戏。
解题方法
- 这一题其实和二分法没有太大关联,是要求最差的情况
- 采用 递归+记忆
- 设计记忆函数 dp[start][end] 表示从头 start 到 end 情况下需要的最小值
- 要计算 dp[start][end] 可以让 i 遍历 [start, end] 然后求出最小值
class Solution {
public int getMoneyAmount(int n) {
if (n <= 1) return 0;
if (n == 2) return 1;
int[][] dp = new int[n + 1][n + 1];
return gH(dp, 1, n);
}
public int gH(int[][] dp, int start, int end) {
if (start >= end) return 0;
if (dp[start][end] > 0) return dp[start][end];
int min = Integer.MAX_VALUE;
for (int i = start; i <= end; i++) {
min = Math.min(min, i + Math.max(gH(dp, start, i - 1), gH(dp, i + 1, end)));
}
dp[start][end] = min;
return min;
}
}
执行耗时:67 ms,击败了5.62% 的Java用户
内存消耗:37.6 MB,击败了68.77% 的Java用户