Skip to content
geeksforgeeks
  • Tutorials
    • Python
    • Java
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
    • Practice Coding Problems
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • DSA
  • Interview Questions on Array
  • Practice Array
  • MCQs on Array
  • Tutorial on Array
  • Types of Arrays
  • Array Operations
  • Subarrays, Subsequences, Subsets
  • Reverse Array
  • Static Vs Arrays
  • Array Vs Linked List
  • Array | Range Queries
  • Advantages & Disadvantages
Open In App
Next Article:
Minimum sum of two numbers formed from digits of an array
Next article icon

Minimum sum of two numbers formed from digits of an array

Last Updated : 20 Jun, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report
Try it on GfG Practice
redirect icon

Given an array arr[] of digits (values are from 0 to 9), find the minimum possible sum of two numbers formed using all digits of the array.

Note: We need to return the minimum possible sum as a string.

Examples: 

Input: arr[] = [6, 8, 4, 5, 2, 3, 0]
Output: "604"
Explanation: The minimum sum is formed by numbers 0358 and 246.

Input: arr[] = [5, 3, 0, 7, 4]
Output: "82"
Explanation: The minimum sum is formed by numbers 35 and 047.

Table of Content

  • [Naive Approach] Using Sorting - O(n logn) time and O(n) space
  • [Expected Approach] Using Count Array - O(n) time and O(n) space

[Naive Approach] Using Sorting - O(n logn) time and O(n) space

A minimum number will be formed from set of digits when smallest digit appears at most significant position and next smallest digit appears at next most significant position and so on. The idea is to sort the array in increasing order and build the first number by digits present in odd positions and second number by digits from even positions in the array. So, that the first two smallest digits are placed in the most significant positions of both numbers, the next two smallest digits are placed in the second most significant positions, and this pattern continues for the remaining digits.

Illustration:

C++
#include <algorithm> #include <iostream> #include <vector> using namespace std;  // Function to add two strings and return the result string addString(string &s1, string &s2) {     int i = s1.length() - 1;     int j = s2.length() - 1;      // initial carry is zero     int carry = 0;      // we will calculate and store the     // resultant sum in reverse order in res     string res = "";     while (i >= 0 || j >= 0 || carry > 0) {         int sum = carry;         if (i >= 0)             sum += (s1[i] - '0');          if (j >= 0)             sum += (s2[j] - '0');          res.push_back(sum % 10 + '0');         carry = sum / 10;         i--;         j--;     }      // remove leading zeroes which are currently     // at the back due to reversed string res     while (!res.empty() && res.back() == '0')         res.pop_back();      // reverse our final string     reverse(res.begin(), res.end());      return res; }  // Function to find and return minimum sum of // two numbers formed from digits of the array. string minSum(vector<int> &arr) {     sort(arr.begin(), arr.end());      // Two String for storing the two minimum numbers     string s1 = "", s2 = "";      for (int i = 0; i < arr.size(); i++) {         if (i % 2 == 0)             s1.push_back(arr[i] + '0');         else             s2.push_back(arr[i] + '0');     }      return addString(s1, s2); }  int main() {     vector<int> arr = {6, 8, 4, 5, 2, 3, 0};      cout << minSum(arr);     return 0; } 
Java
import java.util.*;  class GfG {      // Function to add two numeric strings and return the sum as a string     static String addString(String s1, String s2) {         int i = s1.length() - 1;         int j = s2.length() - 1;         int carry = 0;         String res = "";          while (i >= 0 || j >= 0 || carry > 0) {             int sum = carry;              if (i >= 0)                 sum += s1.charAt(i--) - '0';              if (j >= 0)                 sum += s2.charAt(j--) - '0';              res = (sum % 10) + res;              carry = sum / 10;         }          return res;     }      // Function to find minimum sum of two numbers formed from digits     static String minSum(int[] arr) {         Arrays.sort(arr);          String s1 = "", s2 = "";          for (int i = 0; i < arr.length; i++) {             if (i % 2 == 0)                 // add to first number                 s1 += arr[i];              else                 // add to second number                 s2 += arr[i];          }          return addString(s1, s2);     }      public static void main(String[] args) {         int[] arr = {6, 8, 4, 5, 2, 3, 0};         System.out.println(minSum(arr));      } } 
Python
# Function to add two numbers and return the result def addNumbers(l1, l2):     i = len(l1) - 1     j = len(l2) - 1      # initial carry is zero     carry = 0      # we will calculate and store the      # resultant sum in reverse order in res     res = []     while i >= 0 or j >= 0 or carry > 0:         total = carry         if i >= 0:             total += l1[i]                  if j >= 0:             total += l2[j]                  res.append(str(total % 10))         carry = total // 10         i -= 1         j -= 1      # remove leading zeroes which are currently     # at the back due to reversed string res     while len(res) > 0 and res[-1] == '0':         res.pop()      # reverse our final result     res = res[::-1]     return ''.join(res)  # Function to find and return minimum sum of # two numbers formed from digits of the array. def minSum(arr):     arr.sort()      # Two Lists for storing the two minimum numbers     l1 = []     l2 = []      for i in range(len(arr)):         if i % 2 == 0:             l1.append(arr[i])         else:             l2.append(arr[i])      return addNumbers(l1, l2)  if __name__ == '__main__':     arr = [6, 8, 4, 5, 2, 3, 0]      print(minSum(arr)) 
C#
using System;  class GfG{          // Function to add two numeric strings and return the result as a string     static string addString(string s1, string s2){                  int i = s1.Length - 1;          int j = s2.Length - 1;          int carry = 0;                 string res = "";                        // Loop until both strings are processed and no carry remains         while (i >= 0 || j >= 0 || carry > 0){             int sum = carry;              // Add current digit from s1 if any             if (i >= 0) sum += s1[i--] - '0';              // Add current digit from s2 if any             if (j >= 0) sum += s2[j--] - '0';              // Add least significant digit of sum to result             res = (sum % 10) + res;             carry = sum / 10;         }          // Remove any leading zeros (except when result is "0")         int k = 0;         while (k < res.Length - 1 && res[k] == '0') k++;          return res.Substring(k);      }      // Function to find and return minimum possible sum of two numbers     // formed by using all digits in the array     static string minSum(int[] arr){                  // Sort the digits in ascending order         Array.Sort(arr);           string s1 = "";           string s2 = "";            // Distribute digits alternately between s1 and s2         for (int i = 0; i < arr.Length; i++)         {             if (i % 2 == 0)                 s1 += arr[i];             else                 s2 += arr[i];         }          // Add the two numbers and return their sum as a string         return addString(s1, s2);     }      static void Main(string[] args)     {         int[] arr = { 6, 8, 4, 5, 2, 3, 0 };         Console.WriteLine(minSum(arr));       } } 
JavaScript
// Function to add two lists and return the result function addNumbers(l1, l2) {     let i = l1.length - 1;     let j = l2.length - 1;      // initial carry is zero     let carry = 0;      // we will calculate and store the      // resultant sum in reverse order in res     let res = [];     while (i >= 0 || j >= 0 || carry > 0) {         let sum = carry;         if (i >= 0)             sum += l1[i] - '0';          if (j >= 0)             sum += l2[j] - '0';          res.push(sum % 10);         carry = Math.floor(sum / 10);         i--;         j--;     }      // remove leading zeroes which are currently     // at the back due to reversed list res     while (res.length > 0 && res[res.length - 1] === 0)         res.pop();      // reverse our final list and convert it to a string     return res.reverse().join(''); }  // Function to find and return minimum sum of // two numbers formed from digits of the array. function minSum(arr) {     arr.sort((a, b) => a - b);      // Two lists for storing the two minimum numbers     let l1 = [], l2 = [];      for (let i = 0; i < arr.length; i++) {         if (i % 2 === 0)             l1.push(arr[i]);         else              l2.push(arr[i]);     }      return addNumbers(l1, l2); }  // Driver Code let arr = [6, 8, 4, 5, 2, 3, 0]; console.log(minSum(arr)); 

Output
604

Time Complexity: O(n*logn) as we are sorting the input array.
Auxiliary Space: O(n) to store the result.

[Expected Approach] Using Count Array - O(n) time and O(n) space

The idea is to use a count array to track the frequency of each digit in the input array, eliminating the need for sorting. By iterating through the count array from 0 to 9 and alternately distributing digits to two strings while avoiding leading zeros, we can efficiently create the two smallest numbers that can be formed using all the input digits.

C++
#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std;  // Function to add two strings and return the result string addString(string &s1, string &s2) {          int i = s1.length() - 1;     int j = s2.length() - 1;      // initial carry is zero     int carry = 0;      // we will calculate and store the     // resultant sum in reverse order in res     string res = "";     while (i >= 0 || j >= 0 || carry > 0) {         int sum = carry;         if (i >= 0)             sum += (s1[i] - '0');          if (j >= 0)             sum += (s2[j] - '0');          res.push_back(sum % 10 + '0');         carry = sum / 10;         i--;         j--;     }      // remove leading zeroes which are currently     // at the back due to reversed string res     while (!res.empty() && res.back() == '0')         res.pop_back();      // reverse our final string     reverse(res.begin(), res.end());      return res; }  // Function to find minimum sum using count array approach string minSum(vector<int> &arr) {          // Count array to store frequency of each digit     vector<int> count(10, 0);          // Count occurrences of each digit     for (int num : arr) {         count[num]++;     }          // Two strings for storing the two minimum numbers     string s1 = "", s2 = "";          // Flag to alternate between s1 and s2     bool firstNum = true;          // Traverse count array from 0 to 9     for (int digit = 0; digit < 10; digit++) {                  // Add digit to appropriate string          // while it has occurrences         while (count[digit]--) {             if (firstNum) {                                  // Avoid leading zeros for both numbers                 if (!(s1.empty() && digit == 0))                     s1.push_back(digit + '0');                 firstNum = false;             } else {                 if (!(s2.empty() && digit == 0))                     s2.push_back(digit + '0');                 firstNum = true;             }         }     }          // Handle case where s1 or s2 might be empty     if (s1.empty()) s1 = "0";     if (s2.empty()) s2 = "0";          return addString(s1, s2); }  int main() {     vector<int> arr = {6, 8, 4, 5, 2, 3, 0};     cout << minSum(arr) << endl;     return 0; } 
Java
import java.util.*;  class GfG {      // Function to add two strings and return the result     static String addString(String s1, String s2) {                  int i = s1.length() - 1;         int j = s2.length() - 1;          // initial carry is zero         int carry = 0;          // we will calculate and store the         // resultant sum in reverse order in res         StringBuilder res = new StringBuilder();         while (i >= 0 || j >= 0 || carry > 0) {             int sum = carry;             if (i >= 0)                 sum += (s1.charAt(i) - '0');              if (j >= 0)                 sum += (s2.charAt(j) - '0');              res.append(sum % 10);             carry = sum / 10;             i--;             j--;         }          // remove leading zeroes which are currently         // at the back due to reversed string res         while (res.length() > 0 && res.charAt(res.length() - 1) == '0')             res.deleteCharAt(res.length() - 1);          // reverse our final string         res.reverse();          return res.length() == 0 ? "0" : res.toString();     }      // Function to find minimum sum using count array approach     static String minSum(int[] arr) {         // Count array to store frequency of each digit         int[] count = new int[10];          // Count occurrences of each digit         for (int num : arr) {             count[num]++;         }          // Two strings for storing the two minimum numbers         StringBuilder s1 = new StringBuilder();         StringBuilder s2 = new StringBuilder();          // Flag to alternate between s1 and s2         boolean firstNum = true;          // Traverse count array from 0 to 9         for (int digit = 0; digit < 10; digit++) {              // Add digit to appropriate string              // while it has occurrences             while (count[digit]-- > 0) {                 if (firstNum) {                      // Avoid leading zeros for both numbers                     if (!(s1.length() == 0 && digit == 0))                         s1.append(digit);                     firstNum = false;                 } else {                     if (!(s2.length() == 0 && digit == 0))                         s2.append(digit);                     firstNum = true;                 }             }         }          // Handle case where s1 or s2 might be empty         if (s1.length() == 0) s1.append("0");         if (s2.length() == 0) s2.append("0");          return addString(s1.toString(), s2.toString());     }      public static void main(String[] args) {         int[] arr = {6, 8, 4, 5, 2, 3, 0};         System.out.println(minSum(arr));     } } 
Python
# Function to add two strings and return the result def addString(s1, s2):          i = len(s1) - 1     j = len(s2) - 1      # initial carry is zero     carry = 0      # we will calculate and store the     # resultant sum in reverse order in res     res = []     while i >= 0 or j >= 0 or carry > 0:         total = carry         if i >= 0:             total += int(s1[i])         if j >= 0:             total += int(s2[j])         res.append(str(total % 10))         carry = total // 10         i -= 1         j -= 1      # remove leading zeroes which are currently     # at the back due to reversed string res     while res and res[-1] == '0':         res.pop()      # reverse our final string     return ''.join(reversed(res)) if res else "0"  # Function to find minimum sum using count array approach def minSum(arr):     # Count array to store frequency of each digit     count = [0] * 10      # Count occurrences of each digit     for num in arr:         count[num] += 1      # Two strings for storing the two minimum numbers     s1 = []     s2 = []      # Flag to alternate between s1 and s2     firstNum = True      # Traverse count array from 0 to 9     for digit in range(10):         while count[digit] > 0:             if firstNum:                 if not (len(s1) == 0 and digit == 0):                     s1.append(str(digit))                 firstNum = False             else:                 if not (len(s2) == 0 and digit == 0):                     s2.append(str(digit))                 firstNum = True             count[digit] -= 1      # Handle case where s1 or s2 might be empty     if not s1:         s1.append("0")     if not s2:         s2.append("0")      return addString(''.join(s1), ''.join(s2))  if __name__ == "__main__":     arr = [6, 8, 4, 5, 2, 3, 0]     print(minSum(arr)) 
C#
using System; using System.Collections.Generic;  class GfG {      // Function to add two strings and return the result     static string addString(string s1, string s2) {                  int i = s1.Length - 1;         int j = s2.Length - 1;          // initial carry is zero         int carry = 0;          // we will calculate and store the         // resultant sum in reverse order in res         List<char> res = new List<char>();         while (i >= 0 || j >= 0 || carry > 0) {             int sum = carry;             if (i >= 0)                 sum += (s1[i] - '0');              if (j >= 0)                 sum += (s2[j] - '0');              res.Add((char)(sum % 10 + '0'));             carry = sum / 10;             i--;             j--;         }          // remove leading zeroes which are currently         // at the back due to reversed string res         while (res.Count > 0 && res[res.Count - 1] == '0')             res.RemoveAt(res.Count - 1);          // reverse our final string         res.Reverse();          return res.Count == 0 ? "0" : new string(res.ToArray());     }      // Function to find minimum sum using count array approach     static string minSum(int[] arr) {                  // Count array to store frequency of each digit         int[] count = new int[10];          // Count occurrences of each digit         foreach (int num in arr) {             count[num]++;         }          // Two strings for storing the two minimum numbers         string s1 = "";         string s2 = "";          // Flag to alternate between s1 and s2         bool firstNum = true;          // Traverse count array from 0 to 9         for (int digit = 0; digit < 10; digit++) {              // Add digit to appropriate string              // while it has occurrences             while (count[digit]-- > 0) {                 if (firstNum) {                      // Avoid leading zeros for both numbers                     if (!(s1.Length == 0 && digit == 0))                         s1 += digit.ToString();                     firstNum = false;                 } else {                     if (!(s2.Length == 0 && digit == 0))                         s2 += digit.ToString();                     firstNum = true;                 }             }         }          // Handle case where s1 or s2 might be empty         if (s1.Length == 0) s1 = "0";         if (s2.Length == 0) s2 = "0";          return addString(s1, s2);     }      static void Main() {         int[] arr = { 6, 8, 4, 5, 2, 3, 0 };         Console.WriteLine(minSum(arr));     } } 
JavaScript
// Function to add two strings and return the result function addString(s1, s2) {     let i = s1.length - 1;     let j = s2.length - 1;      // initial carry is zero     let carry = 0;      // we will calculate and store the     // resultant sum in reverse order in res     let res = [];     while (i >= 0 || j >= 0 || carry > 0) {         let total = carry;         if (i >= 0) total += parseInt(s1[i]);         if (j >= 0) total += parseInt(s2[j]);         res.push(total % 10);         carry = Math.floor(total / 10);         i--;         j--;     }      // remove leading zeroes which are currently     // at the back due to reversed string res     while (res.length > 0 && res[res.length - 1] === 0) {         res.pop();     }      // reverse our final string     return res.reverse().join('') || "0"; }  // Function to find minimum sum using count array approach function minSum(arr) {          // Count array to store frequency of each digit     let count = new Array(10).fill(0);      // Count occurrences of each digit     for (let num of arr) {         count[num]++;     }      // Two strings for storing the two minimum numbers     let s1 = [];     let s2 = [];      // Flag to alternate between s1 and s2     let firstNum = true;      // Traverse count array from 0 to 9     for (let digit = 0; digit < 10; digit++) {         while (count[digit]-- > 0) {             if (firstNum) {                 if (!(s1.length === 0 && digit === 0))                     s1.push(digit);                 firstNum = false;             } else {                 if (!(s2.length === 0 && digit === 0))                     s2.push(digit);                 firstNum = true;             }         }     }      // Handle case where s1 or s2 might be empty     if (s1.length === 0) s1.push(0);     if (s2.length === 0) s2.push(0);      return addString(s1.join(''), s2.join('')); }  // Driver Code let arr = [6, 8, 4, 5, 2, 3, 0]; console.log(minSum(arr)); 

Output
604 

Next Article
Minimum sum of two numbers formed from digits of an array

K

kartik
Improve
Article Tags :
  • Sorting
  • DSA
  • Arrays
  • number-digits
Practice Tags :
  • Arrays
  • Sorting

Similar Reads

    Minimum sum of two numbers formed from digits of an array in O(n)
    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 = 604Input: arr[] = {5, 3, 0, 7, 4} Ou
    6 min read
    First digit in product of an array of numbers
    Given an array of 'n' numbers. We need to find the first digit of product of these 'n' numbers Examples : Input : arr[] = {5, 8, 3, 7} Output : 8 Product of 5, 8, 3, 7 is 840 and its first digit is 8 Input : arr[] = {6, 7, 9} Output : 3 Recommended PracticeFirst DigitTry It! Background : First we st
    7 min read
    Maximum K-digit number possible from subsequences of two given arrays
    Given two arrays arr1[] and arr2[] of length M and N consisting of digits [0, 9] representing two numbers and an integer K(K ? M + N), the task is to find the maximum K-digit number possible by selecting subsequences from the given arrays such that the relative order of the digits is the same as in
    12 min read
    Minimum number with digits as 4 and 7 only and given sum
    Lucky numbers are the positive integers whose decimal representations contain only the lucky digits 4 and 7. What minimum lucky number has the sum of digits equal to n. Examples: Input : sum = 11 Output : 47 Sum of digits in 47 is 11 and 47 is the smallest number with given sum. Input : sum = 10 Out
    6 min read
    Find second smallest number from sum of digits and number of digits
    Given the sum of digits as S and the number of digits as D, the task is to find the second smallest number Examples: Input: S = 9, D = 2Output: 27Explanation: 18 is the smallest number possible with sum = 9 and total digits = 2, Whereas the second smallest is 27. Input: S = 16, D = 3Output: 178Expla
    8 min read
geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences