LeetCode-in-Java

2007. Find Original Array From Doubled Array

Medium

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.

Example 1:

Input: changed = [1,3,4,2,6,8]

Output: [1,3,4]

Explanation: One possible original array could be [1,3,4]:

Other original arrays could be [4,3,1] or [3,1,4].

Example 2:

Input: changed = [6,3,0,1]

Output: []

Explanation: changed is not a doubled array.

Example 3:

Input: changed = [1]

Output: []

Explanation: changed is not a doubled array.

Constraints:

Solution

public class Solution {
    public int[] findOriginalArray(int[] changed) {
        if (changed.length % 2 == 1) {
            return new int[0];
        }
        int[] a = new int[100001];
        for (int j : changed) {
            a[j]++;
        }
        if (a[0] % 2 == 1) {
            return new int[0];
        }
        int[] ans = new int[changed.length / 2];
        int p = 0;
        if (a[0] > 0) {
            a[0] /= 2;
            while (a[0] > 0) {
                ans[p++] = 0;
                a[0]--;
            }
        }
        for (int i = 1; i <= 100001 / 2; i++) {
            if (a[i] == 0) {
                continue;
            }
            int tmp = i * 2;
            if (a[tmp] >= a[i]) {
                a[tmp] = a[tmp] - a[i];
                while (a[i] > 0) {
                    ans[p++] = i;
                    a[i]--;
                }
            } else {
                return new int[0];
            }
        }
        for (int i = 1; i < a.length; i++) {
            if (a[i] != 0) {
                return new int[0];
            }
        }
        return ans;
    }
}