[LeetCode] 1262. Greatest Sum Divisible by Three

Posted CNoodle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 1262. Greatest Sum Divisible by Three相关的知识,希望对你有一定的参考价值。

Given an integer array nums, return the maximum possible sum of elements of the array such that it is divisible by three.

Example 1:

Input: nums = [3,6,5,1,8]
Output: 18
Explanation: Pick numbers 3, 6, 1 and 8 their sum is 18 (maximum sum divisible by 3).

Example 2:

Input: nums = [4]
Output: 0
Explanation: Since 4 is not divisible by 3, do not pick any number.

Example 3:

Input: nums = [1,2,3,4,4]
Output: 12
Explanation: Pick numbers 1, 3, 4 and 4 their sum is 12 (maximum sum divisible by 3).

Constraints:

  • 1 <= nums.length <= 4 * 104
  • 1 <= nums[i] <= 104

可被三整除的最大和。

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

这道题的最优解是用 DP 做但是我没有很理解,这里我给出一个次优解,思路是贪心。

既然是找最大的和,那么首先我们可以看一下把整个数组都加起来的和 sum 是否能 % 3,如果 sum % 3 == 0,那么就无须减去任何元素。

比较一般的 case 是 sum % 3 != 0,我们可以创建两个数组 a 和 b,一个放 % 3 == 1 的所有元素,另一个放 % 3 == 2 的所有元素。

  • 如果 sum % 3 == 1,需要减去的是数组 a 里面最小的数字(这个数字 % 3 == 1);或者如果数组 b 里面超过两个元素,我们减去 b 里最小的两个元素(这两个元素的和 % 3 == 1)。这两种情况取较小值
  • 如果 sum % 3 == 2,如果 b 不为空,直接减去 b 中最小数字(这个数字 % 3 == 2);或者 a 中也有至少两个数字,那么减去 a 里最小的两个元素(这两个元素的和 % 3 == 2)。这两种情况取较小值

时间O(n)

空间O(n)

Java实现

 class Solution 
     public int maxSumDivThree(int[] nums) 
         int sum = 0;
         for (int num : nums) 
             sum += num;
         
         // corner case
         if (sum % 3 == 0) 
             return sum;
         
 
         // normal case
         List<Integer> a = new ArrayList<>();
         List<Integer> b = new ArrayList<>();
         for (int num : nums) 
             if (num % 3 == 1) 
                 a.add(num);
              else if (num % 3 == 2) 
                 b.add(num);
             
         
         Collections.sort(a);
         Collections.sort(b);
 
         if (sum % 3 == 2) 
             List<Integer> temp = a;
             a = b;
             b = temp;
         
         int res = a.isEmpty() ? 0 : sum - a.get(0);
         if (b.size() > 1) 
             res = Math.max(res, sum - b.get(0) - b.get(1));
         
         return res;
     
 

 

LeetCode 题目总结

以上是关于[LeetCode] 1262. Greatest Sum Divisible by Three的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 1431. Kids With the Greatest Number of Candies

[LeetCode] 1431. Kids With the Greatest Number of Candies

leetcode1431. Kids With the Greatest Number of Candies

leetcode1431. Kids With the Greatest Number of Candies

LeetCode --- 1071. Greatest Common Divisor of Strings 解题报告

LeetCode --- 1299. Replace Elements with Greatest Element on Right Side