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)