📌  相关文章
📜  重新排列数组,使arr [i]变成arr [arr [i]],并增加O(1)个空间(1)

📅  最后修改于: 2023-12-03 15:42:06.516000             🧑  作者: Mango

重新排列数组

这个问题要求我们将一个数组按照一定规则重新排列,并且不能使用额外的空间。具体的规则是:

将元素 arr[i] 变成 arr[arr[i]]

下面是一个简单的实现:

def rearrange_array(arr):
    n = len(arr)
    for i in range(n):
        arr[i] += (arr[arr[i]] % n) * n
        
    for i in range(n):
        arr[i] = arr[i] // n
        
    return arr
解释

我们可以把每个元素 arr[i] 变成一个二元组 (arr[i], arr[arr[i]]),然后进行一些处理,最后再把每个元素 arr[i] 变成 arr[i][0] 就行了。为了达到这个目的,我们需要使用一定的技巧。

首先,我们可以使用取模运算来存储两个元素:

arr[i] = arr[i] + (arr[arr[i]] % n) * n

这样,arr[i] 就变成了一个两位数的数(十进制表示)。原来的值变成了个位数,而 arr[arr[i]] 变成了十位数。

接下来,我们把每个元素都除以 n,就可以得到 arr[i]。因为 arr[i] 原来的值被存储在个位数上,而 arr[arr[i]] 原来的值被存储在十位数上,所以我们需要模 n。

arr[i] = arr[i] // n

这个算法的时间复杂度是 O(n),因为我们只需要遍历数组两次。而空间复杂度为 O(1),因为我们没有使用额外的空间。

总结

重新排列数组这个问题看似简单,但是需要使用一些技巧才能得到正确的答案。我们可以将每个元素转换成一个二元组,然后处理得到新的数组。这种方法的时间复杂度是 O(n),空间复杂度是 O(1)。