跳跃游戏

296 阅读1分钟

问题总览

微信图片_20230505111020.jpg

类型问题描述完成
45. 跳跃游戏 II
55. 跳跃游戏
1654. 到家的最少跳跃次数
70. 爬楼梯
746. 使用最小花费爬楼梯
877. 石子游戏
1690. 石子游戏 VII

题解

两个跳跃游戏的问题都是用了贪心的方法解决的,不太容易想到。

55. 跳跃游戏

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;
    }
}

45. 跳跃游戏 II

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;
    }
}

70. 爬楼梯

// 不知道是不是最近递归写多了,拿到问题就写递归了😂
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;
    }
}

746. 使用最小花费爬楼梯

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;
    }
}

877. 石子游戏

博弈类,先手必赢,因为题目说双方都尽了最大的努力。