Skip to content

Latest commit

 

History

History
184 lines (152 loc) · 4.62 KB

File metadata and controls

184 lines (152 loc) · 4.62 KB

English Version

题目描述

一个整数数组 original 可以转变成一个 双倍 数组 changed ,转变方式为将 original 中每个元素 值乘以 2 加入数组中,然后将所有元素 随机打乱 。

给你一个数组 changed ,如果 change 是 双倍 数组,那么请你返回 original数组,否则请返回空数组。original 的元素可以以 任意 顺序返回。

 

示例 1:

输入:changed = [1,3,4,2,6,8]
输出:[1,3,4]
解释:一个可能的 original 数组为 [1,3,4] :
- 将 1 乘以 2 ,得到 1 * 2 = 2 。
- 将 3 乘以 2 ,得到 3 * 2 = 6 。
- 将 4 乘以 2 ,得到 4 * 2 = 8 。
其他可能的原数组方案为 [4,3,1] 或者 [3,1,4] 。

示例 2:

输入:changed = [6,3,0,1]
输出:[]
解释:changed 不是一个双倍数组。

示例 3:

输入:changed = [1]
输出:[]
解释:changed 不是一个双倍数组。

 

提示:

  • 1 <= changed.length <= 105
  • 0 <= changed[i] <= 105

解法

Python3

class Solution:
    def findOriginalArray(self, changed: List[int]) -> List[int]:
        if len(changed) % 2 != 0:
            return []
        n = 100010
        counter = [0] * n
        for x in changed:
            counter[x] += 1
        if counter[0] % 2 != 0:
            return []
        res = [0] * (counter[0] // 2)
        for i in range(1, n):
            if counter[i] == 0:
                continue
            if i * 2 > n or counter[i] > counter[i*2]:
                return []
            res.extend([i] * counter[i])
            counter[i*2] -= counter[i]
        return res

Java

class Solution {
    public int[] findOriginalArray(int[] changed) {
        if (changed.length % 2 != 0) {
            return new int[]{};
        }
        int n = 100010;
        int[] counter = new int[n];
        for (int x : changed) {
            ++counter[x];
        }
        if (counter[0] % 2 != 0) {
            return new int[]{};
        }
        int[] res = new int[changed.length / 2];
        int j = counter[0] / 2;
        for (int i = 1; i < n; ++i) {
            if (counter[i] == 0) {
                continue;
            }
            if (i * 2 >= n || counter[i] > counter[i * 2]) {
                return new int[]{};
            }
            counter[i * 2] -= counter[i];
            while (counter[i]-- > 0) {
                res[j++] = i;
            }
        }
        return res;
    }
}

C++

class Solution {
public:
    vector<int> findOriginalArray(vector<int>& changed) {
        if (changed.size() % 2 != 0) return {};
        int n = 100010;
        vector<int> counter(n);
        for (int x : changed) ++counter[x];
        if (counter[0] % 2 != 0) return {};
        vector<int> res(changed.size() / 2);
        int j = counter[0] / 2;
        for (int i = 1; i < n; ++i)
        {
            if (counter[i] == 0) continue;
            if (i * 2 >= n || counter[i] > counter[i * 2]) return {};
            counter[i * 2] -= counter[i];
            while (counter[i]--) res[j++] = i;
        }
        return res;
    }
};

Go

func findOriginalArray(changed []int) []int {
	if len(changed)%2 != 0 {
		return []int{}
	}
	n := 100010
	counter := make([]int, n)
	for _, x := range changed {
		counter[x]++
	}
	if counter[0]%2 != 0 {
		return []int{}
	}
	var res []int
	for j := 0; j < counter[0]/2; j++ {
		res = append(res, 0)
	}
	for i := 1; i < n; i++ {
		if counter[i] == 0 {
			continue
		}
		if i*2 >= n || counter[i] > counter[i*2] {
			return []int{}
		}
		for j := 0; j < counter[i]; j++ {
			res = append(res, i)
		}
		counter[i*2] -= counter[i]
	}
	return res
}

...