如果您的值在有限范围内,则存在 O(n) 时间和 O(1) 空间的解决方案。
确定数组中的最大值。得到一些常数C > arraymax
,例如 -C = 10
为你的数组。
扫描数组,压缩唯一值并计算每个值的重复项。如果值V
has K>0
重复,写V+C*K
而不是价值。
在下一次扫描时查找具有重复项的值,提取重复项的数量并将其写入压缩后的唯一值之后。
def dedup(lst):
mx = max(lst) + 1
dupcnt = 0
delcnt = 0
start = 0
for i in range(1, len(lst) + 1):
if i == len(lst) or (lst[i] != lst[start]):
lst[start - delcnt] = lst[start] + dupcnt * mx
delcnt += dupcnt
start = i
dupcnt = 0
else:
dupcnt += 1
dupidx = len(lst) - delcnt
for i in range(0, len(lst) - delcnt):
dupcnt = lst[i] // mx
if dupcnt:
lst[i] %= mx
for j in range(dupidx, dupidx+dupcnt):
lst[j] = lst[i]
dupidx += dupcnt
return lst
print(dedup([1,2,2,2,3,4,4,5]))
>>> [1, 2, 3, 4, 5, 2, 2, 4]