zoukankan      html  css  js  c++  java
  • leetcode2

    可被三整除的最大和

    给你一个整数数组 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
    /**
     * @param {number[]} nums
     * @return {number}
     */
    // var maxSumDivThree = function(nums) {
    //     let result; 
    //      arr = JSON.parse(JSON.stringify(nums));
    //     let find = (arr, nums)=>{
    //         if(!arr.length) return;
    //         let res = nums.reduce((a, b)=>a+b);
    //         if(!res%3){
    //             result =res;
    //             return
    //         } else {  
    //            let min =  Math.min(...nums);
    //             for(let i=0; i<nums.length; i++){
    //                 if(min = nums[i]){
    //                     nums.splice(i, 1);
    //                     break;
    //                 }
    //             }
    //             find(nums);
    //         }
    //     }
    //     for(let i=1; i<nums.length; i++){
    //       let res = find([], i, nums);
    //       if(res) break;
    //     }
    //     return result;
    // };
    /**
     * @param {number[]} nums
     * @return {number}
     */
    var maxSumDivThree = function(nums) {
        const max = [[0, 0, 0], [0, -1000000000, -1000000000]];
        for (let i = 0; i < nums.length; i++) {
            for (let j = 0; j < 3; j++) {
                max[i % 2][j] = Math.max(max[1 - i % 2][(3 + (j - nums[i]) % 3) % 3] + nums[i], max[1 - i % 2][j])
            }
        }
        return max[1 - nums.length % 2][0];
    };
    /**
     * @param {number[]} nums
     * @return {number}
     */
    var maxSumDivThree = function(nums) {
        const dp = []
        for (let i = 0; i < 3; i ++) {
            dp.push(new Array(nums.length).fill(-1))
        }
        dp[nums[0] % 3][0] = nums[0]
        for (let i = 1; i < nums.length; i ++) {
            dp[nums[i] % 3][i] = nums[i]
            for (let j = 0; j < 3; j ++) {
                if (dp[j][i - 1] != -1) {
                    dp[j][i] = Math.max(dp[j][i], dp[j][i - 1])
                }
            }
            for (let j = 0; j < 3; j ++) {
                if (dp[j][i - 1] != -1) {
                    dp[(j + nums[i]) % 3][i] = Math.max(dp[(j + nums[i]) % 3][i], dp[j][i - 1] + nums[i])
                }
            }
        }
        console.log(dp)
        let res = 0
        for (let i = 0; i < nums.length; i ++) {
            if (dp[0][i] != -1) {
                res = Math.max(res, dp[0][i])
            }
        }
        return res
    };
  • 相关阅读:
    BZOJ 3744 Gty的妹子序列
    BZOJ 3872 Ant colony
    BZOJ 1087 互不侵犯
    BZOJ 1070 修车
    BZOJ 2654 tree
    BZOJ 3243 向量内积
    1003 NOIP 模拟赛Day2 城市建设
    CF865D Buy Low Sell High
    CF444A DZY Loves Physics
    Luogu 4310 绝世好题
  • 原文地址:https://www.cnblogs.com/zhangzs000/p/11878476.html
Copyright © 2011-2022 走看看