LC每日一题|20240418 - 2007. 从双倍数组中还原原数组

45 阅读1分钟

LC每日一题|20240418 - 2007. 从双倍数组中还原原数组

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

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

提示:

  • 1 <= changed.length <= 10^5
  • 0 <= changed[i] <= 10^5

题目级别:Medium

解题思路

非常简单的一道模拟题。

我们可以先对数组进行排序,然后遍历数组,同时使用map记录仍需要处理的数字与其个数。

对于应出现在倍增数组中的数字,我们可以在map中加入其x2之后的值。后期遍历到这个x2值的时候,将其数量从map中 -1,最终只需要判断map中是否已经不存在需要处理的数字即可。

特别的,对于 0 的处理可能需要稍微注意一下,因为它的x2值与自身相同。不过在下文的代码中,这种情况不需要特殊处理。

AC代码

class Solution {
    fun findOriginalArray(changed: IntArray): IntArray {
        changed.sort()
        val map = HashMap<Int, Int>()
        val res = ArrayList<Int>()
        for (n in changed) {
            if (map[n] == null || map[n] == 0) {
                map[n * 2] = (map[n * 2] ?: 0) + 1
                res.add(n)
            } else {
                map[n] = map[n]!! - 1
            }
        }
        map.forEach { if (it.value != 0) return intArrayOf() }
        return res.toIntArray()
    }
}

时间复杂度:O(NlogN) 排序耗时

空间复杂度:O(N) map与结果消耗空间