Java教程

从双倍数组中还原原数组

本文主要是介绍从双倍数组中还原原数组,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一个整数数组 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

题解:注意考虑重复0的情况,还有其他重复数的情况。

code:

class Solution {
    public int[] findOriginalArray(int[] changed) {
        if (changed.length == 1) {
            return new int[0];
        }
        Map<Integer, Integer> map = new TreeMap<>();
        for (int num : changed) {
            if (map.containsKey(num)) {
                map.put(num, map.get(num) + 1);
            } else {
                map.put(num, 1);
            }
        }
        Set<Integer> skipSet = new HashSet<>();
        int k = 0;
        int[] result = new int[changed.length / 2];
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            Integer key = entry.getKey();
            Integer value = entry.getValue();
            if (key == 0) {
                 if (value % 2 == 0) {
                     for (int i = 0; i < value/2; i++) {
                        result[k++] = 0;
                     }
                     continue;
                 } else {
                     return new int[0];
                 } 
            }
            
            if (skipSet.contains(key)) {
                continue;
            }
            int sum = key * 2;
            if (map.containsKey(sum)) {
                Integer value2 = map.get(sum);
                if (value > value2) {
                    return new int[0];
                } else {
                    for (int i = 0; i < value; i++) {
                        result[k++] = key;
                    }
                    if (value == value2) {
                        skipSet.add(sum);
                    } else {
                        map.put(sum, value2 - value);
                    }
                    
                }
            } else {
                return new int[0];
            }
        }
        return result;
    }
}


 

这篇关于从双倍数组中还原原数组的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!