Back to all solutions

#2007 - Find Original Array From Doubled Array

Problem Description

An integer array original is transformed into a doubled array changed by appending twice the value of every element in original, and then randomly shuffling the resulting array.

Given an array changed, return original if changed is a doubled array. If changed is not a doubled array, return an empty array. The elements in original may be returned in any order.

Solution

/**
 * @param {number[]} changed
 * @return {number[]}
 */
var findOriginalArray = function(changed) {
  if (changed.length % 2 !== 0) return [];

  const frequency = new Map();
  const result = [];

  changed.sort((a, b) => a - b);

  for (const num of changed) {
    frequency.set(num, (frequency.get(num) || 0) + 1);
  }

  for (const num of changed) {
    if (frequency.get(num) === 0) continue;

    frequency.set(num, frequency.get(num) - 1);

    const doubled = num * 2;
    if (!frequency.has(doubled) || frequency.get(doubled) === 0) return [];

    frequency.set(doubled, frequency.get(doubled) - 1);
    result.push(num);
  }

  return result;
};