Given an array of digits (values are from 0 to 9), find the minimum possible sum of two numbers formed from digits of the array. All digits of the given array must be used to form the two numbers.
Examples:
Input: arr[] = {6, 8, 4, 5, 2, 3}
Output: 604
246 + 358 = 604
Input: arr[] = {5, 3, 0, 7, 4}
Output: 82
Approach: A minimum number will be formed from the set of digits when smallest digit appears at the most significant position and next to smallest digit appears at next most significant position and so on…
The idea is to build two numbers by alternating picking digits from the array (assuming it is sorted in ascending). So the first number is formed by digits present in odd positions in the array and the second number is formed by digits from even positions in the array. Finally, we return the sum of the first and second number. In order to reduce the time complexity, the array can be sorted in O(n) using the frequency array of digits as every element of the original array is a single digit i.e. there can be at most 10 distinct elements.
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
int minSum(vector< int > arr, int n)
{
int MAX = 10;
int *freq = new int [MAX];
for ( int i = 0; i < n; i++) {
freq[arr[i]]++;
}
int k = 0;
for ( int i = 0; i < MAX; i++) {
for ( int j = 0; j < freq[i]; j++) {
arr[k++] = i;
}
}
int num1 = 0;
int num2 = 0;
for ( int i = 0; i < n; i++) {
if (i % 2 == 0)
num1 = num1 * MAX + arr[i];
else
num2 = num2 * MAX + arr[i];
}
return num1 + num2;
}
int main( void )
{
vector< int >arr = { 6, 8, 4, 5, 2, 3 };
int n = arr.size();
cout << minSum(arr, n);
}
|
Java
public class GFG {
public static final int MAX = 10 ;
static int minSum( int arr[], int n)
{
int freq[] = new int [MAX];
for ( int i = 0 ; i < n; i++) {
freq[arr[i]]++;
}
int k = 0 ;
for ( int i = 0 ; i < MAX; i++) {
for ( int j = 0 ; j < freq[i]; j++) {
arr[k++] = i;
}
}
int num1 = 0 ;
int num2 = 0 ;
for ( int i = 0 ; i < n; i++) {
if (i % 2 == 0 )
num1 = num1 * MAX + arr[i];
else
num2 = num2 * MAX + arr[i];
}
return num1 + num2;
}
public static void main(String[] args)
{
int arr[] = { 6 , 8 , 4 , 5 , 2 , 3 };
int n = arr.length;
System.out.print(minSum(arr, n));
}
}
|
Python3
def minSum(arr, n):
MAX = 10
freq = [ 0 ] * MAX
for i in range (n):
freq[arr[i]] + = 1
k = 0
for i in range ( MAX ):
for j in range ( 0 ,freq[i]):
arr[k] = i
k + = 1
num1 = 0
num2 = 0
for i in range (n):
if i % 2 = = 0 :
num1 = num1 * MAX + arr[i]
else :
num2 = num2 * MAX + arr[i]
return num1 + num2
arr = [ 6 , 8 , 4 , 5 , 2 , 3 ]
n = len (arr);
print (minSum(arr, n))
|
C#
using System;
class GFG {
public static int MAX = 10;
static int minSum( int [] arr, int n)
{
int [] freq = new int [MAX];
for ( int i = 0; i < n; i++) {
freq[arr[i]]++;
}
int k = 0;
for ( int i = 0; i < MAX; i++) {
for ( int j = 0; j < freq[i]; j++) {
arr[k++] = i;
}
}
int num1 = 0;
int num2 = 0;
for ( int i = 0; i < n; i++) {
if (i % 2 == 0)
num1 = num1 * MAX + arr[i];
else
num2 = num2 * MAX + arr[i];
}
return num1 + num2;
}
static public void Main()
{
int [] arr = { 6, 8, 4, 5, 2, 3 };
int n = arr.Length;
Console.WriteLine(minSum(arr, n));
}
}
|
Javascript
<script>
let MAX = 10;
function minSum(arr, n)
{
let freq = new Array(MAX);
freq.fill(0);
for (let i = 0; i < n; i++) {
freq[arr[i]]++;
}
let k = 0;
for (let i = 0; i < MAX; i++) {
for (let j = 0; j < freq[i]; j++) {
arr[k++] = i;
}
}
let num1 = 0;
let num2 = 0;
for (let i = 0; i < n; i++) {
if (i % 2 == 0)
num1 = num1 * MAX + arr[i];
else
num2 = num2 * MAX + arr[i];
}
return num1 + num2;
}
let arr = [ 6, 8, 4, 5, 2, 3 ];
let n = arr.length;
document.write(minSum(arr, n));
</script>
|
Time Complexity: O(n)
Space Complexity: O(n)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
20 Feb, 2023
Like Article
Save Article