题目:
一个整数数组 original 可以转变成一个 双倍 数组 changed ,转变方式为将 original 中每个元素 值乘以 2 加入数组中,然后将所有元素 随机打乱 。
给你一个数组 changed ,如果 change 是 双倍 数组,那么请你返回 original数组,否则请返回空数组。original 的元素可以以 任意 顺序返回。
提示:
1 <= changed.length <= 10^50 <= changed[i] <= 10^5
思考:
数组original中每个元素乘以2加入数组中,得到数组changed ---->
1. 数组changed一定有偶数个元素
2. 数组changed的元素从小到大遍历,设当前元素为x,那么 x*2 一定另外存在于数组changed中,每次判断完后将当前这两个元素从changed中删去,继续向下判断。
代码如下:
class Solution(object):
def findOriginalArray(self, changed):
"""
:type changed: List[int]
:rtype: List[int]
"""
original = []
n = len(changed)
i = 0
if n % 2 == 1:
return[]
changed.sort()
while i < n:
x = changed[i]
original.append(x)
changed.remove(x)
i -= 1
n -= 1
if x * 2 not in changed:
return []
else:
changed.remove(x * 2)
n -= 1
i += 1
return original
提交后卡在例子 176 / 179 超时了:

可以看到这一句判断语句每判断一次都要遍历一次数组,大大增加了耗时:
if x * 2 not in changed:
return []
那么直接在最开始统计changed中每个元素的出现次数即可,代码如下:
from collections import Counter
class Solution(object):
def findOriginalArray(self, changed):
"""
:type changed: List[int]
:rtype: List[int]
"""
original = []
n = len(changed)
i = 0
if n % 2 == 1:
return[]
changed.sort()
count = Counter(changed)
for x in changed:
if count[x] >= 1:
y = x * 2
original.append(x)
count[x] -= 1
if count[y] < 1:
return []
else:
count[y] -= 1
return original
提交通过:
文章讨论了一种方法,用于判断给定数组`changed`是否是由数组`original`中的元素乘以2并随机打乱形成的。原方法通过遍历判断效率低,改进方案是利用计数器统计`changed`中元素及其加倍的出现次数,显著减少了时间复杂度。

被折叠的 条评论
为什么被折叠?



