假设我们有一个0到n-1个不同整数的数组,例如{2,1,4,3,5,0}找到输出

时间:2015-11-17 15:12:02

标签: arrays data-structures language-agnostic big-o

假设我们有一个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}

这里要注意三件事:

  1. 位置的范围为0到n-1,值也有范围0到n-1(显然)。
  2. 不应使用额外的数组或链接列表或任何数据结构。
  3. 应该有时间复杂度O(n)。

1 个答案:

答案 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)