使用O(1)空间重新映射数组

时间:2016-04-12 12:37:26

标签: c++ arrays

对不起,我不确定这个问题叫什么类型,我们只称它为“Remapping”,描述如下: 给定一个目标char数组,比如A [],你必须直接操作A.并且重新映射索引数组index []包含应重新赋值的索引。例如,给定A [] = {a,b,c,d,e},index [] = {2,4,3,0,1}。所以index [0] = 2,这意味着在操作之后,A [0]中的值必须是A [2],A [1]是A [4]等。 我知道如果我们有另一个数组,这个问题非常容易:

vector<char> myarr = vector<char>(A.size());
for (int i = 0; i < myarr.size(); i++)
    myarr[i] = A[index[i]];

// myarr is the answer.

但如果我只允许O(1)空间怎么办呢? 感谢您分享您的意见。

哦顺便说一下,如果我有任何语法错误,请更正:“P

2 个答案:

答案 0 :(得分:2)

可以通过将一对值与常量内存交换来解决问题,以便就地生成结果。虽然不是直接重复,但this question中讨论了该问题。

答案 1 :(得分:0)

你可以用两个变量来做;这是算法的草图:

for i=0:n   
   t_index = i
   swap_index = index[t_index]   
   if index[i]!=-1:
       while t_index!=swap_index
          SWAP(index[t_index],index[swap_index])
          index[t_index] = -1
          t_index = getIndexOfValue(indexe, t_index)

这里没有涉及交换两个值的SWAP和从数组中返回值的索引getIndexOfValue的实现;但他们应该很容易理解

这里的想法是跟踪已交换的值的索引。在第一次交换之后,A [0]最终在A [2]中,所以你需要找出原始数组中索引0的值需要最终的位置,并将其交换到位置.....并且等等。

如果遇到麻烦,将它放在纸上可以帮助您全面了解