Minimum sum of two numbers formed from digits of an array
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 given array must be used to form the two numbers.
Examples:
Input: [6, 8, 4, 5, 2, 3] Output: 604 The minimum sum is formed by numbers 358 and 246 Input: [5, 3, 0, 7, 4] Output: 82 The minimum sum is formed by numbers 35 and 047
Since we want to minimize the sum of two numbers to be formed, we must divide all digits in two halves and assign half-half digits to them. We also need to make sure that the leading digits are smaller.
We build a Min Heap with the elements of the given array, which takes O(n) worst time. Now we retrieve min values (2 at a time) of array, by polling from the Priority Queue and append these two min values to our numbers, till the heap becomes empty, i.e., all the elements of array get exhausted. We return the sum of two formed numbers, which is our required answer. Overall complexity is O(nlogn) as push() operation takes O(logn) and it’s repeated n times.
C/C++
// C++ program to find minimum sum of two numbers // formed from all digits in a given array. #include<bits/stdc++.h> using namespace std; // Returns sum of two numbers formed // from all digits in a[] int minSum(int arr[], int n) { // min Heap priority_queue <int, vector<int>, greater<int> > pq; // to store the 2 numbers formed by array elements to // minimize the required sum string num1, num2; // Adding elements in Priority Queue for(int i=0; i<n; i++) pq.push(arr[i]); // checking if the priority queue is non empty while(!pq.empty()) { // appending top of the queue to the string num1+=(48 + pq.top()); pq.pop(); if(!pq.empty()) { num2+=(48 + pq.top()); pq.pop(); } } // converting string to integer int a = atoi(num1.c_str()); int b = atoi(num2.c_str()); // returning the sum return a+b; } int main() { int arr[] = {6, 8, 4, 5, 2, 3}; int n = sizeof(arr)/sizeof(arr[0]); cout<<minSum(arr, n)<<endl; return 0; } // Contributed By: Harshit Sidhwa |
Java
// Java program to find minimum sum of two numbers // formed from all digits in a given array. import java.util.PriorityQueue; class MinSum { // Returns sum of two numbers formed // from all digits in a[] public static long solve(int[] a) { // min Heap PriorityQueue<Integer> pq = new PriorityQueue<Integer>(); // to store the 2 numbers formed by array elements to // minimize the required sum StringBuilder num1 = new StringBuilder(); StringBuilder num2 = new StringBuilder(); // Adding elements in Priority Queue for (int x : a) pq.add(x); // checking if the priority queue is non empty while (!pq.isEmpty()) { num1.append(pq.poll()+ ""); if (!pq.isEmpty()) num2.append(pq.poll()+ ""); } // the required sum calculated long sum = Long.parseLong(num1.toString()) + Long.parseLong(num2.toString()); return sum; } // Driver code public static void main (String[] args) { int arr[] = {6, 8, 4, 5, 2, 3}; System.out.println("The required sum is "+ solve(arr)); } } |
Output:
The required sum is 604
Anothor method:
We can follow another approach also like this, as we need two numbers such that their sum is minimum, then we would also need two minimum numbers. If we arrange our array in ascending order then we can two digits that will form the smallest numbers,
e.g, 2 3 4 5 6 8, now we can get two numbers starting from 2 and 3. Now first part is done. Now we have to form such that they would contain small digits, i.e pick digits alternatively from array extend your two numbers.
i.e 246, 358. Now if we see analyze this, then we can pick even indexed numbers for num1 and odd number for num2.
Below is the implementation:
C++
// C++ program to find minimum sum of two numbers // formed from all digits in a given array. #include<bits/stdc++.h> using namespace std; // Returns sum of two numbers formed // from all digits in a[] int minSum(int a[], int n){ // sort the elements sort(a,a+n); int num1 = 0; int num2 = 0; for(int i = 0;i<n;i++){ if(i%2==0) num1 = num1*10+a[i]; else num2 = num2*10+a[i]; } return num2+num1; } // Driver code int main() { int arr[] = {5, 3, 0, 7, 4}; int n = sizeof(arr)/sizeof(arr[0]); cout<<"The required sum is "<<minSum(arr, n)<<endl; return 0; } |
Java
import java.util.Arrays; //Java program to find minimum sum of two numbers //formed from all digits in a given array. public class AQRQ { //Returns sum of two numbers formed //from all digits in a[] static int minSum(int a[], int n){ // sort the elements Arrays.sort(a); int num1 = 0; int num2 = 0; for(int i = 0;i<n;i++){ if(i%2==0) num1 = num1*10+a[i]; else num2 = num2*10+a[i]; } return num2+num1; } //Driver code public static void main(String[] args) { int arr[] = {5, 3, 0, 7, 4}; int n = arr.length; System.out.println("The required sum is " + minSum(arr, n)); } } |
Python3
# Python 3 program to find minimum # sum of two numbers formed # from all digits in an given array # Returns sum of two numbers formed # from all digits in a[] def minSum(a, n): # sorted the elements a = sorted(a) num1, num2 = 0, 0 for i in range(n): if i % 2 == 0: num1 = num1 * 10 + a[i] else: num2 = num2 * 10 + a[i] return num2 + num1 # Driver code arr = [5, 3, 0, 7, 4] n = len(arr) print("The required sum is", minSum(arr, n)) # This code is contributed # by Mohit kumar 29 |
C#
// C# a program to find minimum sum of two numbers //formed from all digits in a given array. using System; public class GFG{ //Returns sum of two numbers formed //from all digits in a[] static int minSum(int []a, int n){ // sort the elements Array.Sort(a); int num1 = 0; int num2 = 0; for(int i = 0;i<n;i++){ if(i%2==0) num1 = num1*10+a[i]; else num2 = num2*10+a[i]; } return num2+num1; } //Driver code static public void Main (){ int []arr = {5, 3, 0, 7, 4}; int n = arr.Length; Console.WriteLine("The required sum is " + minSum(arr, n)); } //This code is contributed by ajit. } |
PHP
<?php // PHP program to find minimum sum // of two numbers formed from all // digits in a given array. // Returns sum of two numbers formed // from all digits in a[] function minSum($a, $n) { // sort the elements sort($a); $num1 = 0; $num2 = 0; for($i = 0; $i < $n; $i++) { if($i % 2 == 0) $num1 = $num1 * 10 + $a[$i]; else $num2 = $num2 * 10 + $a[$i]; } return ($num2 + $num1); } // Driver code $arr = array(5, 3, 0, 7, 4); $n = sizeof($arr); echo "The required sum is ", minSum($arr, $n), "\n"; // This Code is Contributed by ajit ?> |
Output:
The required sum is 82
Time Complexity : O(nLogN)
This article is contributed by Prakhar. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Recommended Posts:
- Minimum sum of two numbers formed from digits of an array
- Minimum sum of two numbers formed from digits of an array in O(n)
- Minimum number greater than the maximum of array which cannot be formed using the numbers in the array
- Sum of all numbers that can be formed with permutations of n digits
- Count numbers formed by given two digit with sum having given digits
- N digit numbers divisible by 5 formed from the M digits
- Find the count of numbers that can be formed using digits 3, 4 only and having length at max N.
- Check if the number formed by the last digits of N numbers is divisible by 10 or not
- Find the Largest Cube formed by Deleting minimum Digits from a number
- Print all distinct integers that can be formed by K numbers from a given array of N numbers
- Minimum number of consecutive sequences that can be formed in an array
- Find last k digits in product of an array numbers
- Sum of two numbers where one number is represented as array of digits
- Count the number of digits of palindrome numbers in an array
- Maximum possible time that can be formed from four digits



