假设我们有一个0到n-1个不同整数的数组
示例
{2,1,4,3,5,0}
我们的目标是修改此数组,以使a[0]
成为a[a[0]]
,这意味着a[0]
的值为a[0]
= a[2]
,依此类推。
具有以下输出:
{4,1,5,3,0,2}
。
这里要注意三件事:
答案 0 :(得分:0)
以下是这个想法:
您可以将原始数字和所需数字保存在同一个数组位置,方法是保留原始数字并将新数字作为基数n推送。
这样,要提取原始数字,我们只需要计算模运算:
original = array[index] % array.length
我们可以将目标值除以数组长度
target = array[index] / array.length
这样我们就不需要额外的内存了,我们可以通过两次O(2n) complexity
来完成。
该算法非常简单(在python中实现):
def self_permute(arr):
length = len(arr)
for i in range(length):
if arr[i] < i:
arr[i] += (arr[arr[i]] % length) * length
else:
arr[i] += arr[arr[i]] * length
for i in range(length):
arr[i] /= length
return arr
a = [2,1,4,3,5,0]
print self_permute(a)