题目描述:
一个整数数组 original 可以转变成一个 双倍 数组 changed ,转变方式为将 original 中每个元素 值乘以 2 加入数组中,然后将所有元素 随机打乱 。
给你一个数组 changed ,如果 change 是 双倍 数组,那么请你返回 original数组,否则请返回空数组。original 的元素可以以 任意 顺序返回。
方法一:
class Solution {
public:
vector<int> findOriginalArray(vector<int>& changed) {
if (changed.size() % 2 == 1)
{
return {};
}
unordered_map<int, int> maps;
vector<int> ans;
sort(changed.begin(), changed.end());
int count = 0;
for (int x : changed)
{
if (x % 2 == 0 && maps[x/2] > 0)
{
ans.push_back(x / 2);
maps[x/2]--;
count++;
continue;
}
maps[x]++;
}
if (count == changed.size() / 2)
{
return ans;
}
return {};
}
};
第一时间就想到了使用哈希表来做,但是用哈希表的话还得先排序一遍才行,例如样例:【3,4,2,1,6,8】从前往后遍历时,遇到2的时候,2会优先和4配对,导致后续1和8无法配对,所以先使用sort()排序一遍,就能解决这个问题了。