LC每日一题|20240418 - 2007. 从双倍数组中还原原数组
一个整数数组
original可以转变成一个 双倍 数组changed,转变方式为将original中每个元素 值乘以 2 加入数组中,然后将所有元素 随机打乱 。给你一个数组
changed,如果change是 双倍 数组,那么请你返回original数组,否则请返回空数组。original的元素可以以 任意 顺序返回。
提示:
1 <= changed.length <= 10^50 <= 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与结果消耗空间