🧠
Brute Force (Generate All Permutations)
💡 This approach exists to show the fundamental idea of trying all possible orders to find the maximum, which helps understand why sorting with a custom comparator is needed.
Intuition
Try every possible permutation of the numbers, convert each permutation to a concatenated string, and track the maximum string lexicographically.
Algorithm
- Generate all permutations of the input list.
- For each permutation, concatenate the numbers into a string.
- Compare the concatenated string with the current maximum string.
- Return the maximum concatenated string found.
💡 The brute force algorithm is straightforward but quickly becomes infeasible as permutations grow factorially.
from itertools import permutations
def largestNumber(nums):
max_num = ''
for perm in permutations(nums):
candidate = ''.join(str(num) for num in perm)
if candidate > max_num:
max_num = candidate
# Handle case where all are zeros
return '0' if max_num[0] == '0' else max_num
# Driver code
if __name__ == '__main__':
print(largestNumber([3,30,34,5,9])) # Output: 9534330
Line Notes
from itertools import permutationsImport permutations to generate all possible orderings
for perm in permutations(nums)Iterate over every possible ordering of nums
candidate = ''.join(str(num) for num in perm)Concatenate current permutation into a string
if candidate > max_numUpdate max_num if current candidate is lexicographically larger
return '0' if max_num[0] == '0' else max_numHandle edge case where all numbers are zero
import java.util.*;
public class LargestNumberBrute {
public static String largestNumber(int[] nums) {
List<List<Integer>> permutations = new ArrayList<>();
permute(nums, 0, permutations);
String maxNum = "";
for (List<Integer> perm : permutations) {
StringBuilder sb = new StringBuilder();
for (int num : perm) sb.append(num);
String candidate = sb.toString();
if (candidate.compareTo(maxNum) > 0) maxNum = candidate;
}
if (maxNum.length() > 0 && maxNum.charAt(0) == '0') return "0";
return maxNum;
}
private static void permute(int[] nums, int start, List<List<Integer>> res) {
if (start == nums.length) {
List<Integer> perm = new ArrayList<>();
for (int num : nums) perm.add(num);
res.add(perm);
return;
}
for (int i = start; i < nums.length; i++) {
swap(nums, start, i);
permute(nums, start + 1, res);
swap(nums, start, i);
}
}
private static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public static void main(String[] args) {
System.out.println(largestNumber(new int[]{3,30,34,5,9})); // 9534330
}
}
Line Notes
List<List<Integer>> permutations = new ArrayList<>()Store all permutations generated
permute(nums, 0, permutations)Generate all permutations starting from index 0
for (List<Integer> perm : permutations)Iterate over each permutation to build candidate string
if (candidate.compareTo(maxNum) > 0)Update maxNum if candidate is lexicographically larger
if (maxNum.length() > 0 && maxNum.charAt(0) == '0')Check if all numbers are zero to return '0'
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
void permute(vector<int>& nums, int start, vector<vector<int>>& res) {
if (start == nums.size()) {
res.push_back(nums);
return;
}
for (int i = start; i < nums.size(); i++) {
swap(nums[start], nums[i]);
permute(nums, start + 1, res);
swap(nums[start], nums[i]);
}
}
string largestNumber(vector<int>& nums) {
vector<vector<int>> permutations;
permute(nums, 0, permutations);
string maxNum = "";
for (auto& perm : permutations) {
string candidate = "";
for (int num : perm) candidate += to_string(num);
if (candidate > maxNum) maxNum = candidate;
}
if (!maxNum.empty() && maxNum[0] == '0') return "0";
return maxNum;
}
int main() {
vector<int> nums = {3,30,34,5,9};
cout << largestNumber(nums) << endl; // 9534330
return 0;
}
Line Notes
void permute(vector<int>& nums, int start, vector<vector<int>>& res)Recursive function to generate all permutations
swap(nums[start], nums[i])Swap elements to generate new permutation
string candidate = ""; for (int num : perm) candidate += to_string(num);Concatenate permutation into string
if (candidate > maxNum) maxNum = candidate;Update maxNum if candidate is lexicographically larger
if (!maxNum.empty() && maxNum[0] == '0') return "0";Return '0' if all numbers are zero
function permute(nums, start, res) {
if (start === nums.length) {
res.push(nums.slice());
return;
}
for (let i = start; i < nums.length; i++) {
[nums[start], nums[i]] = [nums[i], nums[start]];
permute(nums, start + 1, res);
[nums[start], nums[i]] = [nums[i], nums[start]];
}
}
function largestNumber(nums) {
const permutations = [];
permute(nums, 0, permutations);
let maxNum = "";
for (const perm of permutations) {
const candidate = perm.map(String).join("");
if (candidate > maxNum) maxNum = candidate;
}
return maxNum[0] === '0' ? '0' : maxNum;
}
// Test
console.log(largestNumber([3,30,34,5,9])); // 9534330
Line Notes
function permute(nums, start, res)Recursive function to generate all permutations
[nums[start], nums[i]] = [nums[i], nums[start]];Swap elements to create new permutation
const candidate = perm.map(String).join("");Concatenate permutation into string
if (candidate > maxNum) maxNum = candidate;Update maxNum if candidate is lexicographically larger
return maxNum[0] === '0' ? '0' : maxNum;Return '0' if all numbers are zero
TimeO(n! * n * k) where n is number of elements and k is average digit length
SpaceO(n! * n) to store all permutations
Generating all permutations is factorial in n, and concatenation/comparison adds linear overhead.
💡 For n=10, factorial is 3,628,800, which is impractical to compute in interviews.
Interview Verdict: TLE
This approach is too slow for large inputs but helps understand the problem's nature and motivates better solutions.