2021.9.20 力扣-从双倍数组中还原原数组

题目描述:

一个整数数组 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()排序一遍,就能解决这个问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值