Maximum Swap
MediumMathGreedy
Solution
Solution1: Brute Force
export function maximumSwap(num: number): number {
const digits = getDigits(num);
const n = digits.length;
let answer = num;
for (let i = 0; i < n; i++) {
for (let j = i + 1; j < n; j++) {
swap(digits, i, j);
answer = Math.max(answer, parseInt(digits.join('')));
swap(digits, i, j);
}
}
return answer;
}
function getDigits(num: number): number[] {
return [...num.toString()].map((v) => parseInt(v));
}
function swap(arr: number[], i: number, j: number): void {
[arr[i], arr[j]] = [arr[j], arr[i]];
}
Complexity
- Time:
O(N^2)
- Space:
O(N)
Solution2: Greedy
export function maximumSwap(num: number): number {
const digits = getDigits(num);
const n = digits.length;
const lastIndices = new Array<number>(10).fill(-1);
for (let i = 0; i < n; i++) {
lastIndices[digits[i]] = i;
}
for (let i = 0; i < n; i++) {
for (let d = 9; digits[i] < d; d--) {
if (i < lastIndices[d]) {
swap(digits, i, lastIndices[d]);
return parseInt(digits.join(''));
}
}
}
return num;
}
function getDigits(num: number): number[] {
return [...num.toString()].map((v) => parseInt(v));
}
function swap(arr: number[], i: number, j: number): void {
[arr[i], arr[j]] = [arr[j], arr[i]];
}
Complexity
- Time:
O(N)
- Space:
O(N)