【每日一题Day242】LC1262可被三整除的最大和 | 贪心 dp

简介: 【每日一题Day242】LC1262可被三整除的最大和 | 贪心 dp

可被三整除的最大和【LC1262】

给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。

  • 思路
    题目要求求出能被3整除的最大和,那么我们可以记录每种余数对应的最大和【贪心,相同余数的情况下取最大值】,那么答案即为val[0]。枚举每一个数,将其与目前的最大和相加得到三个可能的答案,然后存入数组中记录最大值
  • 实现
class Solution {
    public int maxSumDivThree(int[] nums) {
        // 哈希表
        int[] val = new int[3];// 记录余数对应的最大和->那么答案即为val[0]
        for (int num : nums){  
            int a = val[0] + num;
            int b = val[1] + num;
            int c = val[2] + num;
            val[a % 3] = Math.max(a, val[a % 3]);
            val[b % 3] = Math.max(b, val[b % 3]);
            val[c % 3] = Math.max(c, val[c % 3]);
        }
        return val[0];
    }
}

image.pngimage.png

class Solution {
    public int maxSumDivThree(int[] nums) {
        int n = nums.length;
        var memo = new int[n][3];
        for (int i = 0; i < n; i++)
            Arrays.fill(memo[i], -1); // -1 表示没有计算过
        return dfs(memo, nums, n - 1, 0);
    }
    private int dfs(int[][] memo, int[] nums, int i, int j) {
        if (i < 0) return j == 0 ? 0 : Integer.MIN_VALUE;
        if (memo[i][j] != -1) return memo[i][j]; // 之前计算过
        return memo[i][j] = Math.max(dfs(memo, nums, i - 1, j),
                dfs(memo, nums, i - 1, (j + nums[i]) % 3) + nums[i]);
    }
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/greatest-sum-divisible-by-three/solutions/2313700/liang-chong-suan-fa-tan-xin-dong-tai-gui-tsll/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

递推

扩展一维找到边界

class Solution {
    public int maxSumDivThree(int[] nums) {
        int n = nums.length;
        var f = new int[n + 1][3];
        f[0][1] = f[0][2] = Integer.MIN_VALUE;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < 3; j++)
                f[i + 1][j] = Math.max(f[i][j], f[i][(j + nums[i]) % 3] + nums[i]);
        return f[n][0];
    }
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/greatest-sum-divisible-by-three/solutions/2313700/liang-chong-suan-fa-tan-xin-dong-tai-gui-tsll/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


目录
相关文章
|
1月前
【每日一题Day202】LC1015可被 K 整除的最小整数 | 模运算
【每日一题Day202】LC1015可被 K 整除的最小整数 | 模运算
37 2
|
1月前
【每日一题Day185】LC1027最长等差数列 | dp
【每日一题Day185】LC1027最长等差数列 | dp
26 0
|
1月前
【每日一题Day331】LC2560打家劫舍 IV | 二分查找 + 贪心
【每日一题Day331】LC2560打家劫舍 IV | 二分查找 + 贪心
21 0
|
1月前
【每日一题Day114】LC1223 掷骰子模拟 | 记忆化搜索+dp
【每日一题Day114】LC1223 掷骰子模拟 | 记忆化搜索+dp
39 0
|
1月前
【每日一题Day366】LC2103环和杆 | 状态压缩
【每日一题Day366】LC2103环和杆 | 状态压缩
30 0
|
1月前
|
索引
【每日一题Day183】LC1187使数组严格递增 | dp
【每日一题Day183】LC1187使数组严格递增 | dp
28 0
|
1月前
[leetcode ~dp ]279. 完全平方数
[leetcode ~dp ]279. 完全平方数
|
1月前
|
机器学习/深度学习
【每日一题Day271】LC918环形子数组的最大和 | 分类讨论 + dp
【每日一题Day271】LC918环形子数组的最大和 | 分类讨论 + dp
26 0
【每日一题Day271】LC918环形子数组的最大和 | 分类讨论 + dp
|
1月前
【每日一题Day328】LC198打家劫舍 | 动态规划
【每日一题Day328】LC198打家劫舍 | 动态规划
26 0
|
1月前
【每日一题Day306】LC228汇总区间 | 双指针
【每日一题Day306】LC228汇总区间 | 双指针
23 0