Minimum sum of two numbers formed from digits of an array - GeeksforGeeks

20 Apr, 2022
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++
Java
Python3
C#
Javascript
// 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 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));    }}
# Python3 program to find minimum# sum of two numbers formed from# all digits in a given array.from queue import PriorityQueue # Returns sum of two numbers formed# from all digits in a[]def solve(a):         # min Heap    pq = PriorityQueue()         # To store the 2 numbers    # formed by array elements to    # minimize the required sum    num1 = ""    num2 = ""     # Adding elements in    # Priority Queue    for x in a:        pq.put(x)     # Checking if the priority    # queue is non empty    while not pq.empty():        num1 += str(pq.get())        if not pq.empty():            num2 += str(pq.get())        # The required sum calculated    sum = int(num1) + int(num2)         return sum     # Driver codeif __name__=="__main__":         arr = [ 6, 8, 4, 5, 2, 3 ]    print("The required sum is ", solve(arr)) # This code is contributed by rutvik_56
// C# program to find minimum sum of two numbers// formed from all digits in a given array.using System;using System.Collections.Generic;class GFG{         // Returns sum of two numbers formed    // from all digits in a[]    public static long solve(int[] a)    {               // min Heap        List<int> pq = new List<int>();          // to store the 2 numbers formed by array elements to        // minimize the required sum        string num1 = "";        string num2 = "";          // Adding elements in Priority Queue        foreach(int x in a)            pq.Add(x);                     pq.Sort();          // checking if the priority queue is non empty        while (pq.Count > 0)        {            num1 = num1 + pq[0];            pq.RemoveAt(0);            if (pq.Count > 0)            {                num2 = num2 + pq[0];                pq.RemoveAt(0);            }        }          // the required sum calculated        int sum = Int32.Parse(num1) + Int32.Parse(num2);          return sum;    }       // Driver code  static void Main()  {    int[] arr = {6, 8, 4, 5, 2, 3};    Console.WriteLine("The required sum is "+ solve(arr));  }} // This code is contributed by divyesh072019.
<script> // Javascript 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 solve(a)    {        // min Heap        pq=[];        // to store the 2 numbers formed by array elements to        // minimize the required sum        let num1="";        let num2="";                 // Adding elements in Priority Queue        for(let x=0;x<a.length;x++)        {            pq.push(a[x]);        }        pq.sort(function(a,b){return b-a;});                 // checking if the priority queue is non empty        while(pq.length!=0)        {            num1+=pq.pop();            if(pq.length!=0)            {                num2+=pq.pop();            }        }        // the required sum calculated        let sum=parseInt(num1)+parseInt(num2);        return sum;    }    // Driver code    let arr=[6, 8, 4, 5, 2, 3];    document.write("The required sum is "+ solve(arr));         // This code is contributed by avanitrachhadiya2155     </script>
Output: 
The required sum is 604
Another 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. First part is done now. Moving forward 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 an odd number for num2.
Below is the implementation:
C++
C
Java
Python3
C#
PHP
Javascript
// 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 codeint 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;} // This code is contributed by Sania Kumari Gupta
// C program to find minimum sum of two numbers// formed from all digits in a given array.#include <stdio.h>#include <stdlib.h>int cmpfunc(const void* a, const void* b){    return (*(int*)a - *(int*)b);} // Returns sum of two numbers formed// from all digits in a[]int minSum(int a[], int n){     // sort the elements    qsort(a, n, sizeof(int), cmpfunc);    //     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 codeint main(){    int arr[] = { 5, 3, 0, 7, 4 };    int n = sizeof(arr) / sizeof(arr[0]);    printf("The required sum is %d", minSum(arr, n));    return 0;} // This code is contributed by Sania Kumari Gupta
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));    }} // This code is contributed by Sania Kumari Gupta
# 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 codearr = [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# 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 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?>
<script>     // JavaScript 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        a.sort();         let num1 = 0;        let num2 = 0;        for(let i = 0;i<n;i++){            if(i%2==0)                num1 = num1*10+a[i];            else num2 = num2*10+a[i];        }        return num2+num1;    }         let arr = [5, 3, 0, 7, 4];    let n = arr.length;    document.write("The required sum is  " + minSum(arr, n));     </script>
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 write.geeksforgeeks.org or mail your article to review-team@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. 
harrypotter0
pushpender673
jit_t
ukasp
mohit kumar 29
rutvik_56
khushboogoyal499
divyesh072019
mukesh07
avanitrachhadiya2155
krisania804
number-digits
Arrays
Greedy
Heap
Mathematical
Queue
Arrays
Greedy
Mathematical
Queue
Heap
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum and minimum of an array using minimum number of comparisons
Introduction to Arrays
Multidimensional Arrays in Java
Linear Search
Linked List vs Array
Dijkstra's shortest path algorithm | Greedy Algo-7
Kruskal’s Minimum Spanning Tree Algorithm | Greedy Algo-2
Prim’s Minimum Spanning Tree (MST) | Greedy Algo-5
Write a program to print all permutations of a given string
Huffman Coding | Greedy Algo-3