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,则删除数组中余数为1的最小的元素, 或者2个two的元素相加余数也是1,去除两个two的元素。 同理,如果余数是2,则删除数组中余数为2的最小的元素, 或者2个one的元素相加余数也是2,去除两个one的元素。

java代码:

class Solution {
    public int maxSumDivThree(int[] nums) {
        Arrays.sort(nums);
        int sum = Arrays.stream(nums).sum();
        int yu = sum % 3;
        if (yu == 0) {
            return sum;
        }
        List one = new ArrayList();
        List two = new ArrayList();
        for (int n : nums) {
            if (n % 3 == 1) {
                one.add(n);
            } else if (n % 3 == 2) {
                two.add(n);
            }
        }

        int res = 0;
        //如果余数是1, 则从one中去除一个, 或者2个two的元素相加余数也是1,去除两个two的元素
        if (yu == 1) {
            if (one.size() > 0) {
                res = sum - one.get(0);
            }
            if (two.size() > 1) {
                res = Math.max(res, sum - two.get(0) - two.get(1));
            }
        }

        //如果余数是2, 则从two中去除一个, 或者2个one的元素相加余数也是2,去除两个one的元素
        if (yu == 2) {
            if (two.size() > 0) {
                res = sum - two.get(0);
            }
            if (one.size() > 1) {
                res = Math.max(res, sum - one.get(0) - one.get(1));
            }
        }

        return res;
    }
}

你可能感兴趣的:(leetcode-数组,算法)