1262. 可被三整除的最大和(贪心||动态规划)

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

示例 1:

输入:nums = [3,6,5,1,8]
输出:18
解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。
示例 2:

输入:nums = [4]
输出:0
解释:4 不能被 3 整除,所以无法选出数字,返回 0。
示例 3:

输入:nums = [1,2,3,4,4]
输出:12
解释:选出数字 1, 3, 4 以及 4,它们的和是 12(可被 3 整除的最大和)。

提示:

1 <= nums.length <= 4 * 10^4
1 <= nums[i] <= 10^4
一.贪心做法。
如果一开始数组中所有的数字和是3的倍数的话,那么就直接输出就可以了。
如果一开始数组中所有的数字和取余3等于1的话,有两种情况:
①减去一个取余3为1的数字
②减去两个取余3为2的数字
这两种情况取最优
如果一开始数组中所有的数字和取余3等于2的话,有两种情况:
①减去一个取余3为2的数字
②减去两个取余3为1的数字
这两种情况取最优
代码如下:

class Solution {
public:
    int maxSumDivThree(vector<int>& nums) {
        vector<int> p[4];
        int num=0;
        for(int i=0;i<nums.size();i++) 
        {
            num+=nums[i];
            p[nums[i]%3].push_back(nums[i]);
        }
        int x;
        if(num%3==0) x=num;
        else if(num%3==1)
        {
            sort(p[1].begin(),p[1].end());
            sort(p[2].begin(),p[2].end());
            if(p[1].size()==0&&p[2].size()<2) x=0;
            else if(p[1].size()==0) x=num-p[2][0]-p[2][1];
            else if(p[2].size()<2) x=num-p[1][0];
            else x=max(num-p[2][0]-p[2][1],num-p[1][0]);
        }
        else{
            sort(p[1].begin(),p[1].end());
            sort(p[2].begin(),p[2].end());
            if(p[2].size()==0&&p[1].size()<2) x=0;
            else if(p[2].size()==0) x=num-p[1][0]-p[1][1];
            else if(p[1].size()<2) x=num-p[2][0];
            else x=max(num-p[1][0]-p[1][1],num-p[2][0]);
        }
        return x;
    }
};

动态规划。
dp[i]代表着取余3之后为i的最大值。O(n)的做法,在遍历的时候不断更新dp[i],最后输出dp[0].
代码如下:

class Solution {
public:
    int maxSumDivThree(vector<int>& nums) {
        int dp[4];
        dp[0]=0;dp[1]=dp[2]=-10005;//dp[1]和dp[2]设置为负无穷
        for(int i=0;i<nums.size();i++)
        {
            int x=nums[i]%3;
            int a1=dp[(0-x+3)%3];
            int b1=dp[(1-x+3)%3];
            int c2=dp[(2-x+3)%3];
            dp[0]=max(dp[0],a1+nums[i]);
            dp[1]=max(dp[1],b1+nums[i]);
            dp[2]=max(dp[2],c2+nums[i]);
        }
        return dp[0];
    }
};

努力加油a啊,(o)/~

你可能感兴趣的:(1262. 可被三整除的最大和(贪心||动态规划))