All files / problems/largestPermutation index.ts

83.33% Statements 65/78
85.71% Branches 12/14
100% Functions 4/4
83.33% Lines 65/78

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 791x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 3x 3x 1x 1x 1x 1x 1x 3x 3x                           3x 3x 3x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 3x 3x 1x 1x 1x 1x 3x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 3x 3x 3x 1x 1x 1x 1x 1x  
// Given an array A of random permutation of numbers from 1 to N. Given the number of swaps in A
// That we can make.
// Find the largest permutation possible.
// • Constraints:
// • 1 < N < 1e6
// • 1 < B < 1e9
 
// It just like sort but with limited swaps
 
export const largestPermutationFirst = (arr: number[], k: number): number[] => {
  if (k === 0) return arr;
  let times = k;
  const result = [...arr];
  const arrSorted = result.sort((a, b) => b - a);
  const valueToKey = result.reduce<{ [key: string]: number }>(
    (pre, value, index) => {
      pre[value] = index;
      return pre;
    },
    {}
  );
 
  let i = 0;
  while (times > 0 && i < arr.length) {
    // if current item is the same
    if (result[i] !== arrSorted[i]) {
      // find key of current value
      const key = valueToKey[arrSorted[i]];

      // swap
      result[key] = result[i];
      result[i] = arrSorted[i];

      // update valueToKey
      valueToKey[result[i]] = key;
      valueToKey[arrSorted[i]] = result[i];

      times--;
    }
 
    i++;
  }
 
  return result;
};
 
export const largestPermutation = (arr: number[], k: number): number[] => {
  let i = 0;
  let max = arr.length;
  const valueToKey = arr.reduce<{ [key: string]: number }>(
    (pre, value, index) => {
      pre[value] = index;
      return pre;
    },
    {}
  );
 
  while(k > 0 && i < arr.length) {
    if (arr[i] !== max) {
      const key = valueToKey[max];
      valueToKey[max] = i;
      valueToKey[arr[i]] = key;
 
      const temp = arr[i];
      arr[i] = max;
      arr[key] = temp;
 
      k--;
    }
 
    max--;
    i++;
  }
 
  return arr;
};
 
export default largestPermutation;