[Simple] 洗牌算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gogdizzy/article/details/4917488

题目要求:

平时洗牌是两打牌,交叉洗在一起.
也就是开始 1 2 3 4 5 6 7 8
第一次 1 5 2 6 3 7 4 8
第二次 1 3 5 7 2 4 6 8
。。。
第k次 ...

给你一个数组a[2N],要求在O(1)的空间复杂度内给a[2N]k次洗牌.


解决方案:

首先寻找规律,有如下性质:

1> 最开始和最后的两张牌永远不变

2> 中间有2N-2张牌,即一张牌最多可能有2N-2种位置,这2N-2张牌一定是全动,即不可能存在两个状态,
   它们的一部分相同,而另一部分不同。这条性质说明了洗牌会进入循环,并且循环节最大为2N-2。

3> 将除去1以后剩下的2N-1张牌看成是一个循环圈,就是说超出2N-1就从循环圈的开始数,那么,
   第一次洗牌,2向后移动1个位置,3向后移动2个位置,……
   第二次洗牌,2向后移动2个位置,3向后移动4个位置,……
   ……
   第k次洗牌,2向后移动2^k - 1个位置,3向后移动2*(2^k-1)个位置,4向后移动3*(2^k-1)个位置……
                        2N-1向后移动(2N-2)*(2^k-1)个位置。

 

没有更多推荐了,返回首页