算法训练营第三十二天|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

51 阅读1分钟

虽然这几天的任务是学习贪心算法,但是大多数能用动态规划的题我都用的动态规划解法。

122. 买卖股票的最佳时机 II

class Solution {
    public int maxProfit(int[] prices) {
        // dp[i][0]第i天持有股票后的最多现金
        // dp[i][1]第i天持有的最多现金
        int[][] dp = new int[prices.length][2];

        dp[0][0] = - prices[0];

        for(int i = 1; i < prices.length; i++){
            dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] - prices[i]);
            dp[i][1] = Math.max(dp[i-1][0] + prices[i], dp[i-1][1]);
        }

        return dp[prices.length - 1][1]; // 最后一天只能清仓
    }
}

55. 跳跃游戏

class Solution {
    public boolean canJump(int[] nums) {
        int rightMost = nums[0];
        for(int i = 0; i <= rightMost; i++){
            rightMost = Math.max(rightMost, i + nums[i]);
            if(rightMost >= nums.length - 1)return true;
        }
        return false;
    }
}

45. 跳跃游戏 II

class Solution {
    public int jump(int[] nums) {
        // dp[i]表示到达索引i的最小跳跃次数
        int[] dp = new int[nums.length];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;

        for(int i = 1; i < nums.length; i++){
            for(int j = 0; j < i; j++){
                if(j + nums[j] >= i){
                    dp[i] = Math.min(dp[i], dp[j] + 1);
                }
            }
        }

        return dp[nums.length - 1];
    }
}