Table of Contents
Problem Statement:
Greatest Sum Divisible by Three LeetCode Solution: Array nums
of integers are given, we need to find 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 * 10^4
1 <= nums[i] <= 10^4
Approach:
- This problem can be solved by using Dynamic Programming
- Every number can be represented as a reminder of 3. So, num% 3 can be 0,1,2.
- Our dp state is represented by rec(ind, sum).
- rec(ind,0) = largest sum till index is divided by three.
- rec(ind,1)= largest sum when divided by 3, remainder = 1.
- rec(ind,2)= largest sum when divided by 3, remainder = 2.
- We will use include exclude principal to tackle this dp.
- rec(ind,sum)=max(a[ind]+rec(ind,(sum+a[ind])%3),rec(ind+1,sum)).
- Now discuss the base condition. If we reach the end of the array then (reminder of a sum) must be zero.
- We will discuss recursion with memoization.
Code of Greatest Sum Divisible by Three LeetCode Solution:
C++ Code:
class Solution { public: int maxSumDivThree(vector<int>& nums) { vector<int> dp={0,INT_MIN,INT_MIN}; for(auto i: nums){ vector<int> tmp(3); for(int j=0;j<3;j++){ tmp[(j+i)%3]=max(dp[(j+i)%3],dp[j]+i); } dp=tmp; } return dp[0]; } };
Java Code:
class Solution { int[][] dp = new int[100005][3]; int n; int rec(int ind,int sum,int[] a) { if(ind>=n) { if(sum!=0) return Integer.MIN_VALUE; return 0; } if(dp[ind][sum]!=-1) return dp[ind][sum]; int k=(sum+a[ind])%3; int ans1=a[ind]+rec(ind+1,k,a); int ans2=rec(ind+1,sum,a); return dp[ind][sum]=Math.max(ans1,ans2); } public int maxSumDivThree(int[] nums) { n=nums.length; int i,j; for(i=0;i<=n;i++) for(j=0;j<=2;j++) dp[i][j]=-1; return rec(0,0,nums); } }
Complexity Analysis for Greatest Sum Divisible by Three LeetCode Solution:
Time complexity:
Time complexity is o(n*3) or we can simply say o(n).
Space complexity:
Space complexity is o(n*3) or we can simply say o(n). We are creating a dp table to store the values.