Given an array of integers arr[] represents digits of a number. The task is to write a program to generate the largest number possible using these digits.
Note: The digits in the array are between 0 and 9. That is, 0 < arr[i] < 9.
Examples:
Input: arr[] = {4, 7, 9, 2, 3}
Output: Largest number: 97432
Input: arr[] = {8, 6, 0, 4, 6, 4, 2, 7}
Output: Largest number: 87664420
Naive Approach:
The naive approach is to sort the given array of digits in descending order and then form the number using the digits in the array keeping the order of digits in the number the same as that of the sorted array.
Time Complexity: O(N logN), where N is the number of digits.
Below is the implementation of the above idea:
C++
#include <bits/stdc++.h>
using namespace std;
int findMaxNum( int arr[], int n)
{
sort(arr, arr + n, greater< int >());
int num = arr[0];
for ( int i = 1; i < n; i++) {
num = num * 10 + arr[i];
}
return num;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 0 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << findMaxNum(arr, n);
return 0;
}
|
Java
import java.util.*;
import java.util.Arrays;
class GFG {
static int findMaxNum( int arr[], int n)
{
Arrays.sort(arr);
int num = arr[n - 1 ];
for ( int i = n - 2 ; i >= 0 ; i--) {
num = num * 10 + arr[i];
}
return num;
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 3 , 4 , 5 , 0 };
int n = arr.length;
System.out.println(findMaxNum(arr, n));
}
}
|
Python3
def findMaxNum(arr, n):
arr.sort(reverse = True )
num = arr[ 0 ]
for i in range ( 1 , n):
num = num * 10 + arr[i]
return num
if __name__ = = "__main__" :
arr = [ 1 , 2 , 3 , 4 , 5 , 0 ]
n = len (arr)
print (findMaxNum(arr, n))
|
C#
using System;
public class GFG {
static int findMaxNum( int [] arr, int n)
{
Array.Sort(arr);
int num = arr[0];
for ( int i = n - 1; i >= 0; i--) {
num = num * 10 + arr[i];
}
return num;
}
static public void Main()
{
int [] arr = { 1, 2, 3, 4, 5, 0 };
int n = arr.Length;
Console.WriteLine(findMaxNum(arr, n));
}
}
|
PHP
<?php
function findMaxNum(& $arr , $n )
{
rsort( $arr );
$num = $arr [0];
for ( $i = 1; $i < $n ; $i ++)
{
$num = $num * 10 + $arr [ $i ];
}
return $num ;
}
$arr = array (1, 2, 3, 4, 5, 0);
$n = sizeof( $arr );
echo findMaxNum( $arr , $n );
?>
|
Javascript
<script>
function findMaxNum(arr, n)
{
arr.sort( function (a,b){ return b-a;});
var num = arr[0];
for ( var i=1; i<n; i++)
{
num = num*10 + arr[i];
}
return num;
}
var arr = [1, 2, 3, 4, 5, 0];
var n = arr.length;
document.write(findMaxNum(arr,n));
</script>
|
Time complexity: O(nlogn)
Auxiliary space: O(1)
Efficient Approach: An efficient approach is to observe that we have to form the number using only digits from 0-9. Hence we can create a hash of size 10 to store the number of occurrences of the digits in the given array into the hash table. Where the key in the hash table will be digits from 0 to 9 and their values will be the count of their occurrences in the array.
Finally, print the digits the number of times they occur in descending order starting from the digit 9.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void findMaxNum( int arr[], int n)
{
int hash[10] = { 0 };
for ( int i = 0; i < n; i++)
hash[arr[i]]++;
for ( int i = 9; i >= 0; i--)
for ( int j = 0; j < hash[i]; j++)
cout << i;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 0 };
int n = sizeof (arr) / sizeof (arr[0]);
findMaxNum(arr, n);
return 0;
}
|
C
#include <stdio.h>
void findMaxNum( int arr[], int n)
{
int hash[10] = { 0 };
for ( int i = 0; i < n; i++)
hash[arr[i]]++;
for ( int i = 9; i >= 0; i--)
for ( int j = 0; j < hash[i]; j++)
printf ( "%d" , i);
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 0 };
int n = sizeof (arr) / sizeof (arr[0]);
findMaxNum(arr, n);
return 0;
}
|
Java
class GFG {
static void findMaxNum( int arr[], int n)
{
int [] hash = new int [ 10 ];
for ( int i = 0 ; i < n; i++)
hash[arr[i]]++;
for ( int i = 9 ; i >= 0 ; i--)
for ( int j = 0 ; j < hash[i]; j++)
System.out.print(i);
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 3 , 4 , 5 , 0 };
int n = arr.length;
findMaxNum(arr, n);
}
}
|
Python 3
def findMaxNum(arr, n):
hash = [ 0 ] * 10
for i in range (n):
hash [arr[i]] + = 1
for i in range ( 9 , - 1 , - 1 ):
for j in range ( hash [i]):
print (i, end = "")
if __name__ = = "__main__" :
arr = [ 1 , 2 , 3 , 4 , 5 , 0 ]
n = len (arr)
findMaxNum(arr,n)
|
C#
using System;
class GFG
{
static void findMaxNum( int [] arr,
int n)
{
int [] hash = new int [10];
for ( int i = 0; i < n; i++)
{
hash[arr[i]]++;
}
for ( int i = 9; i >= 0; i--)
{
for ( int j = 0; j < hash[i]; j++)
Console.Write(i);
}
}
public static void Main()
{
int [] arr = {1, 2, 3, 4, 5, 0};
int n = arr.Length;
findMaxNum(arr,n);
}
}
|
PHP
<?php
function findMaxNum( $arr , $n )
{
$hash = array_fill (0, 10, 0);
for ( $i = 0; $i < $n ; $i ++)
$hash [ $arr [ $i ]] += 1;
for ( $i = 9; $i >= 0; $i --)
for ( $j = 0; $j < $hash [ $i ]; $j ++)
echo $i ;
}
$arr = array (1, 2, 3, 4, 5, 0);
$n = sizeof( $arr );
findMaxNum( $arr , $n );
?>
|
Javascript
<script>
function findMaxNum( arr, n)
{
var hash = Array(10).fill(0);
for ( var i=0; i<n; i++)
{
hash[arr[i]]++;
}
for ( var i=9; i>=0; i--)
{
for ( var j=0; j<hash[i]; j++)
document.write(i);
}
}
var arr = [1, 2, 3, 4, 5, 0];
var n = arr.length;
findMaxNum(arr,n);
</script>
|
Complexity Analysis:
- Time Complexity: O(N), where N is the number of digits.
- Auxiliary Space: O(1), size of hash is only 10 which is a constant.