完美洗牌问题——计算位置i下次要被挤到哪个位置j?

完美洗牌问题——计算位置i下次要被挤到哪个位置j?

提示:非常重要的知识点


什么是完美洗牌问题?

完美洗牌问题的定义:

给你一个arr,长度是偶数长度S,左边部分长度为N,右边部分长度为N
请将左边右边部分交叉组合,保证时间复杂度不会超过o(n),空间复杂度不会超过o(1)——即完美洗牌


一、审题

示例:看图:
图1
最后L与R交叉组合放置
显然
L从1234位置去了2468位置
R从5678位置去了1357位置


二、解题:计算位置i下次要被挤到哪个位置j

有啥关系呢
看表

ij
12
24
36
48
51
63
75
87

S=8,N=4
位置i<=N时,去了2i的偶数位置【本就是1234去偶数位置
位置I>N时,去了2*(i-N)-1位置【本质上就是让i向左平移N个位置到1234,然后去奇数位置

显然代码很好写,arr,目前长度是S,在位置i处,下一次要被挤到哪里去呢?用f(arr,i,S)来算j:

//重要的挤兑环找即将去的位置,看i与N的关系,S==2N
    public static int findNextIndex(int i, int S){
        int N = S >> 1;
        if (i > N) return 2*(i - N) - 1;//向左平移N位的奇数位置
        else return 2 * i;//i<=N,就是偶数位置
    }

总结

提示:重要经验:

1)熟悉完美洗牌问题的定义
2)知道偶数长度S情况下,计算i下次要被挤去过的位置j的函数如何求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰露可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值