问题总览
| 类型 | 问题描述 | 完成 |
|---|---|---|
| 45. 跳跃游戏 II | ✅ | |
| 55. 跳跃游戏 | ✅ | |
| 1654. 到家的最少跳跃次数 | ||
| 70. 爬楼梯 | ✅ | |
| 746. 使用最小花费爬楼梯 | ✅ | |
| 877. 石子游戏 | ✅ | |
| 1690. 石子游戏 VII |
题解
两个跳跃游戏的问题都是用了贪心的方法解决的,不太容易想到。
class Solution {
public boolean canJump(int[] nums) {
boolean ans = false;
int len = nums.length;
int maxJumpTo = 0;
for (int i = 0; i < len - 1; i++) {
maxJumpTo = Math.max(maxJumpTo, nums[i] + i);
if (maxJumpTo <= i) {
return false;
}
}
return true;
}
}
class Solution {
public int jump(int[] nums) {
int n = nums.length;
int end = 0, farthest = 0;
int jumps = 0;
for (int i = 0; i < n - 1; i++) {
farthest = Math.max(nums[i] + i, farthest);
// end ==i 这个条件我反正是想不到
if (end == i) {
jumps++;
end = farthest;
}
}
return jumps;
}
}
// 不知道是不是最近递归写多了,拿到问题就写递归了😂
class Solution {
int[] meno = null;
public int climbStairs(int n) {
meno = new int[n + 1];
Arrays.fill(meno, -1);
return climb(n);
}
public int climb(int n) {
if (n <= 2) {
return n;
}
if (meno[n] != -1) {
return meno[n];
}
int val = climb(n - 1) + climb(n - 2);
meno[n] = val;
return val;
}
}
// 这个问题只跟i-1和i-2有关,用迭代更好些
class Solution {
public int climbStairs(int n) {
if (n <= 2) {
return n;
}
int p = 1, q = 2;
for (int i = 3; i <= n; i++) {
int r = p + q;
p = q;
q = r;
}
return q;
}
}
class Solution {
public int minCostClimbingStairs(int[] cost) {
int len = cost.length;
// 爬到第i层台阶需要的最小费用
//dp[i] = Math.min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
int p = 0, q = 0;
for (int i = 2; i <= len; i++) {
int r = Math.min(q + cost[i - 1], p + cost[i - 2]);
p = q;
q = r;
}
return q;
}
}
博弈类,先手必赢,因为题目说双方都尽了最大的努力。