题解

这道题目核心就算是要知道如果x%3=2的话,应该要去拿%3=1的数字,这样子才能满足%3=0

贪心

sum不够%3的时候,就减去余数为1的或者余数为2的 需要注意 两个余数为1会变成余数为2的,所以可能减去2个余数为1

核心代码如下

public int maxSumDivThreeOther(int[] nums) {

   int sum = Arrays.stream(nums).sum();

   if (sum%3==0){
       return sum;
  }


//   要么减去1的 要么减去2的

   ArrayList<Integer> a1 = new ArrayList<>();
   ArrayList<Integer> a2 = new ArrayList<>();
   for (int i = 0; i < nums.length; i++) {

       if (nums[i]%3==1){
           a1.add(nums[i]);
      }
       if (nums[i]%3==2){
           a2.add(nums[i]);
      }
  }
   Collections.sort(a1);
   Collections.sort(a2);
//   判断减去哪个
   int max=0;
   if (sum%3==1&&!a1.isEmpty()){
       max=Math.max(max,sum-a1.get(0));


  }
   if (sum%3==1&&a2.size()>=2){
       max=Math.max(max,sum-a2.get(0)-a2.get(1));
  }

   if (sum%3==2&&!a2.isEmpty()){
       max=Math.max(max,sum-a2.get(0));

  }
   if (sum%3==2&&a1.size()>=2){
       max=Math.max(max,sum-a1.get(0)-a1.get(1));

  }
   return max;
}

dp

不需要知道前面几个选了什么

1.dpi 表示0-i 选了若干个,余数总共是j的 最大数值

然后在前面几个0,i-1选择数值为s的,然后(s+x)%3 =j 算出s=(j-x)%3 这样子,不过如果出现负号的话,还是需要先+3的

如下代码

public int maxSumDivThreeOther2(int[] nums) {
   int n=nums.length;
   //1.dp[i][j] 表示0-i 选了若干个,余数总共是j的 最大数值
   int[][] dp = new int[n+1][3];

//   2.递推式 是要求从前i-1个 拿数值s ,要求j的位置上 (s+x)%3==j 所以s=(j-x)%3 由于(j-x)%3 可能是符号 -2 -1 这种 所以要+3

   dp[0][0]=0;
   //非法数字 0个数字余数是1 为了避免选择这个 就后续可以让0和Integer.MIN_VALUE比较
   dp[0][1]=Integer.MIN_VALUE;
   dp[0][2]=Integer.MIN_VALUE;
   for (int i = 1; i <= n; i++) {


       for (int j = 0; j < 3; j++) {
           int pre=(j-nums[i-1])%3;
           if ((j-nums[i-1]) %3<0){
               pre+=3;
          }
           dp[i][j]=Math.max(dp[i-1][j],dp[i-1][pre ]+nums[i-1]);

      }


  }

   return dp[n][0];


}
 

每日一题力扣 1262 https://leetcode.cn/problems/greatest-sum-divisible-by-three/的更多相关文章

  1. 刷题-力扣-剑指 Offer 42. 连续子数组的最大和

    剑指 Offer 42. 连续子数组的最大和 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de ...

  2. 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器

    剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...

  3. 刷题-力扣-541. 反转字符串 II

    541. 反转字符串 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-string-ii 著作权归领扣网络所有. ...

  4. 刷题-力扣-113. 路径总和 II

    113. 路径总和 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/path-sum-ii 著作权归领扣网络所有.商业转载请联系 ...

  5. 刷题-力扣-1137. 第 N 个泰波那契数

    1137. 第 N 个泰波那契数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/n-th-tribonacci-number 著作权 ...

  6. 刷题-力扣-LCP 07. 传递信息

    LCP 07. 传递信息 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/chuan-di-xin-xi 著作权归领扣网络所有.商业转 ...

  7. 刷题-力扣-168. Excel表列名称

    168. Excel表列名称 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/excel-sheet-column-title 著作权 ...

  8. 刷题-力扣-337. 打家劫舍 III

    337. 打家劫舍 III 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/house-robber-iii 著作权归领扣网络所有.商 ...

  9. 刷题-力扣-230. 二叉搜索树中第K小的元素

    230. 二叉搜索树中第K小的元素 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a ...

  10. 刷题-力扣-剑指 Offer 15. 二进制中1的个数

    剑指 Offer 15. 二进制中1的个数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de- ...

随机推荐

  1. 五月八号java基础知识点

    1.对于容器中元素进行访问时,经常需要按照某种次序对容器中的每个元素访问且仅访问 一次,这就是遍历,也称为迭代.2.遍历是指从容器中获得当前元素的后续元素.对元素的遍历有很多种:第一种就是foreac ...

  2. Unable to find real location for: <frozen codecs>

    问题描述 pycharm 在debug时出现了如下bug ----------------------------------------------------------------------- ...

  3. SpringBoot 集成 Quartz + MySQL

    Quartz 简单使用 Java SpringBoot 中,动态执行 bean 对象中的方法 源代码地址 => https://gitee.com/VipSoft/VipBoot/tree/de ...

  4. 22-source-map

    const { resolve } = require('path') const htmlWebpackPlugins = require('html-webpack-plugin') module ...

  5. jquery 禁用按钮无效 disabled属性设置无效

    禁用按鈕 $(this).prop("disabled", true); 啟用按鈕 $(this).prop("disabled", false); 禁用按鈕 ...

  6. [ZJOI2020] 序列 线性规划做法/贪心做法

    线性规划做法 同时也作为线性规划对偶的一个小小的学习笔记. 以下 \(\cdot\) 表示点积,\(b,c,x,y\) 是行向量. \(A\) 是矩阵,对于向量 \(u,v\) 若 \(\forall ...

  7. 聊一聊 GDB 调试程序时的几个实用命令

    一:背景 1. 讲故事 用惯了宇宙第一的 Visual Studio 再用其他的开发工具还是有一点不习惯,不习惯在于想用的命令或者面板找不到,总的来说还是各有千秋吧,今天我们来聊一下几个在调试中比较实 ...

  8. Visual Basic 6 API压缩数据

    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As ...

  9. Pillow模块——生成随机验证码

    urls.py path('get_code/',views.get_code), views.py中 from PIL import Image,ImageFont,ImageDraw " ...

  10. 2021-07-11:给定一个棵完全二叉树,返回这棵树的节点个数,要求时间复杂度小于O(树的节点数)。

    2021-07-11:给定一个棵完全二叉树,返回这棵树的节点个数,要求时间复杂度小于O(树的节点数). 福大大 答案2021-07-11: 右树最左节点层数==左树最左节点层数,左树是满二叉树,统计左 ...