约瑟夫环算法

0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

算法解释约瑟夫环
如一个数组是
[0,1,2,3,4]然后进行约瑟夫环数学计算
第一轮:
[0,1,2,3,4]删除的是第3个数字:2,数组就变成[0,1,3,4],第二轮就从新数组里面的数字3开始计算
第二轮:
[0,1,3,4]删除的第3个数字是0,数组就变成了[1,3,4],第三轮就从新数组里面的数字1开始计算后三个数
第三轮:
[1,3,4]删除的第三个数字是4,数组会变成[1,3],第四轮就从新数组里面的数字1开始计算后三个数
第四轮:
[1,3]删除的第3个数字是1,数组只剩下3,因此最后剩下的数字就是3,此时的数组里面的3,下标是0

那么我们现在就开始反推:
最后剩下的数字它的最新坐标肯定是0;
第四轮的反推:
补上3个位置,然后模上当时的数组大小2,(0+3)%2 = 1
第三轮的反推:
补上3个位置,然后模上当时的数组大小2,(1+3)%3 = 1
第二轮反推:
补上3个位置,然后模上当时的数组大小2,(1+3)%4 = 0
第一轮反推:
补上3个位置,然后模上当时的数组大小2,(0+3)%5 = 3
最终剩下的数字下标就是3,所以数组[0,1,2,3,4]每次删除第3个数字剩下来的数字就是3;

反推的规律就是:
当前的(index + 3) % 上一轮的数组剩余个数

python:


```python
class solution:
    def joseph(self,n:int,m:int):
	k = 0(设置删除到最后一轮剩下的数字坐标为0)
		for i in range(2,n+1):
(反推从上一轮开始,上一轮剩下的是两个数字,最终是为了反推到最开始有n个数字的数组,因为需要反推到n个数字,所以要对n进行+1)
			k = (m+k) % i   利用上面反推的规律
	return k
(最后得出最开始的数组所在位置,因为数组都是从0开始的有序数组,那么得出的既是原始数组的下标也是原始数组的数字)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值