486. 预测赢家 java

题目:力扣

解题思路:

1、递归

2、记忆化递归

3、动态规划(滑动数组)

参考:力扣

递归代码 (关键是choose_l,choose_r的理解)

class Solution {
    public boolean PredictTheWinner(int[] nums) {
        return helper(nums, 0 , nums.length-1) >= 0;
    }
    public int helper(int[] nums, int left, int right){
        if(left == right){
            return nums[left];
        }
        int choose_l = nums[left] - helper(nums, left+1, right);
        int choose_r = nums[right] - helper(nums, left, right-1);
        return Math.max(choose_l, choose_r);
    }
}

 

记忆化递归

class Solution {
    int[][] dp;
    public boolean PredictTheWinner(int[] nums) {
        int len = nums.length;
        dp = new int[len][len];
        return helper(nums, 0 , len-1) >= 0;
    }
    public int helper(int[] nums, int left, int right){
        if(dp[left][right] > 0){
            return dp[left][right];
        }
        if(left == right){
            dp[left][right] = nums[left];
            return nums[left];
        }
        int choose_l = nums[left] - helper(nums, left+1, right);
        int choose_r = nums[right] - helper(nums, left, right-1);
        dp[left][right] = Math.max(choose_l, choose_r);
        return dp[left][right];
    }
}

 

动态规划

class Solution {
    public boolean PredictTheWinner(int[] nums) {
        int len = nums.length;
        int[][] dp = new int[len][len];
        for(int i = 0; i < len; i++){
            dp[i][i] = nums[i];
        }
        for(int i = len-2; i >= 0; i--){
            for(int j = i+1; j < len; j++){
                dp[i][j] = Math.max(nums[i] - dp[i+1][j], nums[j] - dp[i][j-1]);
            }
        }
        return dp[0][len-1] >= 0;
    }
}

 使用滑动数组

class Solution {
    public boolean PredictTheWinner(int[] nums) {
        int len = nums.length;
        int[] dp = new int[len];
        for(int i = 0; i < len; i++){
            dp[i] = nums[i];
        }
        for(int i = len-2; i >= 0; i--){
            for(int j = i+1; j < len; j++){
                dp[j] = Math.max(nums[i] - dp[j], nums[j] - dp[j-1]);
            }
        }
        return dp[len-1] >= 0;
    }
}

 

全部评论

相关推荐

小浪_Coding:找硬件测试,也可兼顾软测欧, 简历还可以的 ,注意排版,项目写的有条理一点, 然后个人技能多加点, 润色好简历之后就开始沟通海投了,深圳,东莞这边做硬件相关的公司还不少, 医疗类,仪器类的都可以尝试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务