分配是从向量中对负数和正数进行排序。问题是算法必须是O(n)并且到位 我的解决方案"是:
def Rearrange(arr):
neg = []
pos = []
for x in arr:
if x < 0:
neg.append(x)
else:
pos.append(x)
return neg + pos
所以,我想知道这个算法是否到位?我知道循环和追加操作满足就地算法。但是存储值的列表呢?它是否使用太多额外空间来满足就地算法?如果确实如此,那么这个问题是否容易解决?现在我有点卡住了。
答案 0 :(得分:2)
您是否需要对整个数组进行排序,或者只是左侧是负值而右侧是正值(和0)?
如果你想要实现的是第二件事,那么下面的函数应该可以工作(它可以正常工作,它是O(n)):
def rearrange(array):
left = 0
right = len(array) - 1
while left < right:
if array[left] >= 0 > array[right]:
array[right], array[left] = array[left], array[right]
left += 1
right -= 1
elif array[left] < 0:
left += 1
else:
right -= 1
>>> array = [-5, 6, 7, -4, 2, 0, -1]
>>> rearrange(array)
>>> array
[-5, -1, -4, 7, 2, 0, 6]
答案 1 :(得分:0)
没有。此解决方案尚未到位。创建了两个新对象(列表),您可以根据您指定的逻辑不断附加这些对象。
据我所知,您无法仅使用标准库获取数据的原位视图。
如果现场解决方案对您很重要,您可以使用第三方库,例如numpy
。
如果O(n)解决方案很重要,您应该在list.append
循环中使用生成器或for
到2个列表。
答案 2 :(得分:0)
您无法更改变量inplace
,但您可以使用以下内容O(n)
:
def rearrange(arr):
result = []
for i in arr:
if i < 0:
result.insert(0, i)
else:
result.append(i)
return result
修改强>
根据@Chris_Rands提案,使用deque
的解决方案似乎是最快的:
from collections import deque
def rearrange2(arr):
result = deque()
for i in arr:
if i < 0:
result.appendleft(i)
else:
result.append(i)
return result
比根据28%
结果的公认解决方案快%timeit
。
%timeit rearrange_accepted(nums)
100 loops, best of 3: 12.2 ms per loop
%timeit rearrange2(nums)
100 loops, best of 3: 8.84 ms per loop