[Simple] 洗牌算法

题目要求:

平时洗牌是两打牌,交叉洗在一起.
也就是开始 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)个位置。

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值