Given an array containing digits[], where each element is a single digit integer. The array may contain duplicates. The task is to find all the unique integers that follow the given requirements:
- The integer consists of the concatenation of three elements from digits in any arbitrary order.
- The integer does not have leading zeros.
Examples:
Input: digits[] = {2, 1, 3, 0}
Output: {102, 103, 120, 123, 130, 132, 201, 203, 210, 213, 230, 231, 301, 302, 310, 312, 320, 321}
Explanation: The above are the three digit numbers formed.Input: digits[] = {3, 7, 5}
Output: [357, 375, 537, 573, 735, 753 ]
Approach: This problem can be solved by using Frequency Map. Find count of all elements in given digits array. Follow the steps below to solve the given problem.
- Check for all numbers between 100 to 999 whether they can be formed by the digits present in the digits vector.
- Use 2 maps for the same. If the number can be made, then add it to the answer.
- In the end, return the answer.
Below is the implementation of the above approach:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to find all the unique // 3 digit number that can be formed // from the given digits vector< int > find3DigitNumbers(vector< int >& digits) { // Generating frequency map // of the given digits vector< int > count(10, 0); for ( auto & d : digits) count[d]++; vector< int > res; for ( int num = 100; num < 999; num++) { // Generating frequency map // of the current number vector< int > currCount(10, 0); int temp = num; while (temp) { currCount[temp % 10]++; temp /= 10; } // Checking if the number // can be generated or not bool flag = true ; for ( int i = 0; i < 10; i++) { if (currCount[i] > count[i]) { flag = false ; break ; } } if (flag) { res.push_back(num); } } return res; } // Function to print answer void printAnswer(vector< int >& v1) { for ( int i = 0; i < v1.size(); i++) { cout << v1[i] << " " ; } cout << endl; } // Driver code int main() { vector< int > v1 = { 2, 1, 3, 0 }; // Function Call vector< int > ans = find3DigitNumbers(v1); // Printing answer printAnswer(ans); return 0; } |
Java
// Java program for the above approach import java.io.*; import java.lang.*; import java.util.*; class GFG { // Function to find all the unique // 3 digit number that can be formed // from the given digits static void find3DigitNumbers( int digits[], List<Integer> res) { // Generating frequency map // of the given digits int count[] = new int [ 10 ];; for ( int i = 0 ; i < digits.length; i++) count[digits[i]]++; for ( int num = 100 ; num < 999 ; num++) { // Generating frequency map // of the current number int currCount[] = new int [ 10 ]; int temp = num; while (temp > 0 ) { currCount[temp % 10 ]++; temp /= 10 ; } // Checking if the number // can be generated or not Boolean flag = true ; for ( int i = 0 ; i < 10 ; i++) { if (currCount[i] > count[i]) { flag = false ; break ; } } if (flag == true ) { res.add(num); } } } // Function to print answer static void printAnswer(List<Integer> res) { for ( int i = 0 ; i < res.size(); i++) System.out.print(res.get(i) + " " ); } // Driver code public static void main (String[] args) { int arr[] = { 2 , 1 , 3 , 0 }; List<Integer> ans= new ArrayList<Integer>(); // Function Call find3DigitNumbers(arr, ans); // Printing answer printAnswer(ans); } } // This code is contributed by hrithikgarg03188. |
Python3
# Python code for the above approach # Function to find all the unique # 3 digit number that can be formed # from the given digits def find3DigitNumbers(digits): # Generating frequency map # of the given digits count = [ 0 ] * 10 for d in digits: count[d] + = 1 res = [] for num in range ( 100 , 999 ): # Generating frequency map # of the current number currCount = [ 0 ] * 10 temp = num while (temp): currCount[temp % 10 ] + = 1 temp = temp / / 10 # Checking if the number # can be generated or not flag = True for i in range ( 10 ): if (currCount[i] > count[i]): flag = False break if (flag): res.append(num) return res # Function to print answer def printAnswer(v1): for i in range ( len (v1)): print (v1[i], end = " " ) print ('') # Driver code v1 = [ 2 , 1 , 3 , 0 ] # Function Call ans = find3DigitNumbers(v1) # Printing answer printAnswer(ans) # This code is contributed by Saurabh Jaiswal |
C#
// C# program for the above approach using System; using System.Collections; class GFG { // Function to find all the unique // 3 digit number that can be formed // from the given digits static void find3DigitNumbers( int []digits, ArrayList res) { // Generating frequency map // of the given digits int []count = new int [10];; for ( int i = 0; i < digits.Length; i++) count[digits[i]]++; for ( int num = 100; num < 999; num++) { // Generating frequency map // of the current number int []currCount = new int [10]; int temp = num; while (temp > 0) { currCount[temp % 10]++; temp /= 10; } // Checking if the number // can be generated or not bool flag = true ; for ( int i = 0; i < 10; i++) { if (currCount[i] > count[i]) { flag = false ; break ; } } if (flag == true ) { res.Add(num); } } } // Function to print answer static void printAnswer(ArrayList res) { for ( int i = 0; i < res.Count; i++) Console.Write(res[i] + " " ); } // Driver code public static void Main () { int []arr = { 2, 1, 3, 0 }; ArrayList ans= new ArrayList(); // Function Call find3DigitNumbers(arr, ans); // Printing answer printAnswer(ans); } } // This code is contributed by Samim Hossain Mondal. |
Javascript
<script> // JavaScript code for the above approach // Function to find all the unique // 3 digit number that can be formed // from the given digits function find3DigitNumbers( digits) { // Generating frequency map // of the given digits let count = new Array(10).fill(0); for (let d of digits) count[d]++; let res = []; for (let num = 100; num < 999; num++) { // Generating frequency map // of the current number let currCount = new Array(10).fill(0); let temp = num; while (temp) { currCount[temp % 10]++; temp = Math.floor(temp / 10); } // Checking if the number // can be generated or not let flag = true ; for (let i = 0; i < 10; i++) { if (currCount[i] > count[i]) { flag = false ; break ; } } if (flag) { res.push(num); } } return res; } // Function to print answer function printAnswer(v1) { for (let i = 0; i < v1.length; i++) { document.write(v1[i] + " " ); } document.write( '<br>' ) } // Driver code let v1 = [2, 1, 3, 0]; // Function Call let ans = find3DigitNumbers(v1); // Printing answer printAnswer(ans); // This code is contributed by Potta Lokesh </script> |
102 103 120 123 130 132 201 203 210 213 230 231 301 302 310 312 320 321
Time Complexity: O(N)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!