引用【左神】
【问题描述】
假设有长度为2*n的数组[a1,a2,a3,.......,an,b1,b2,b3,......bn],洗牌后的顺序为[b1,a1,b2,a2,......,bn,an],要求:空间复杂度为O(n),时间复杂度为O(1)。
【问题分析】
在考虑空间和时间复杂度的情况下,该题目室友难度的。左神讲解的坐标连环怼方法我觉得很有意思,解决技巧也很高。
首先我们来举例说明一下什么是坐标连环怼。
两个数组A[1,2,3,4],B[a,b,c,d]。理应结果C[a,1,b,2,c,3,d,4]
画图解释一下。
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
开始前 | 1 | 2 | 3 | 4 | a | b | c | d |
开始后 | a | 1 | b | 2 | c | 3 | d | 4 |
由此由序号可得到一个环,1-2-4-8-7-5-1
我们发现还有两个位置没有占,那就是3,6,那第二个环就是3-6-3
在这里我们说明一下换的个数依赖于数组的长度,2n=(3^k-1),K值为换的个数。当数组的长度与(3^k-1)不相等是,想办法将数组划分为几个((3^k-1))组合的形式,分别进行坐标连环怼。已经知道第一个坐标,求下一个怼的坐标为(2*i)%(2n+1),
比如说我知道我要从第一个坐标开始怼 ,那么第二个坐标为2,第三个坐标为4。
对于完美洗牌问题,我只能理解到这里,代码还不会写。有大神会写的可以分享在这里。如果想要更加详细的理解完美洗牌问题,推荐
http://blog.csdn.net/sunnyyoona/article/details/43795243