# Finding the Largest Multiple of Three

## Problem Statement

We are provided with an array of digits, and our task is to determine the largest multiple of three that can be created by concatenating some or all of these digits in any order. If it's not possible to form a valid multiple of three, return an empty string. To handle potential size issues, the result should be returned as a string, avoiding unnecessary leading zeros.

## Java Implementation

### Java Approach 1

Output:

Code Explanation:

• The Java code implements an algorithm to find the largest multiple of three from an array of digits. The core idea is to maintain an array of strings dp, representing the largest multiple of three for each residue modulo 3.
• The algorithm iterates through the array of digits, updating the dp array accordingly. It considers three cases: the current digit is divisible by 3, the current digit plus the residue forms a multiple of three, or the current digit contributes to a new largest multiple of three.
• The len array keeps track of the length of each residue's largest multiple. The result is then obtained by concatenating the dp[0] string, removing any leading zeros. The algorithm efficiently handles different scenarios for constructing the largest multiple of three, leveraging dynamic programming.

Time Complexity:

• The dominant factor contributing to the time complexity is the sorting operation applied to the array of digits at the beginning using Arrays.sort(). The sorting operation has a time complexity of O(N log N), where N is the length of the input array.

Space Complexity:

• The space complexity is constant because the additional space used remains the same regardless of the input size. The primary data structures employed, such as arrays and strings, do not scale with the input size.

Drawbacks:

• The drawback of the provided solution is its reliance on sorting, which contributes to a time complexity of O(N log N). This sorting operation could be considered excessive for certain scenarios, particularly when the array of digits is already sorted or nearly sorted.
• In such cases, the algorithm's efficiency could be improved by leveraging the inherent order of the input. Additionally, the algorithm uses dynamic programming with arrays, which might lead to increased space usage for larger inputs, impacting its scalability.

### Java Approach 2

Output:

Code Explanation:

• The Java code aims to find the largest multiple of three from an array of digits. It takes user input, parses the comma-separated digits, and then calls the largestMultipleOfThree method to compute the result. The algorithm, encapsulated within the largestMultipleOfThree method, employs a dynamic programming approach.
• It iterates through the array of digits, updating the largest multiple of three for each residue modulo 3. The result is obtained by concatenating the dynamic programming array's elements.

Time Complexity:

• The time complexity of the algorithm is O(N+M) where is N is the number of digits in the input array; and is M is the number of unique digits. In the first iteration of the algorithm, the digital frequency counts is executed while in the second time it constructs the result.

Space Complexity:

• The space complexity is O(M), where M is the number of unique digits. The algorithm uses an array (counter) to store the frequency of each digit, and the size of this array is constant (10 elements) regardless of the input size.

Drawbacks:

• The drawback of this solution is that it uses a greedy approach to adjust the digits to form the largest multiple of three. While this approach works in many cases, it might not guarantee the global optimum. There can be scenarios where making a local optimum choice at one step leads to a suboptimal overall solution.
• A more exhaustive search or dynamic programming approach might be required for a globally optimal solution in all cases.

### Java Approach 3

Output:

Time Complexity:

• The Time complexity of the algorithm depends on the number of iterations of the loops aimed at finding minimal digit and removing it.
• The worse situation occurs whereby several cycles are required, in order to transform the sum into a multiple of three For this problem,
• The order of magnitude for the execution time will be about O(N), where N stands for the number of digits in a given input array.

Space Complexity:

• The space complexity is O(1), as the additional space used is constant regardless of the input size. The arrays mod1, mod2, and count have fixed sizes (10 integers each), and the StringBuilder ans grows linearly with the number of digits in the input.