剑指 Offer 62. 圆圈中最后剩下的数字 —— 公式的由来

这道题又叫瑟夫环问题,代码非常简单,但是理解起来比较困难,这篇文章帮助你简单并深刻理解解法 (不是那个环链表解法,是那个数学解法),也防止我自己忘记

# 公式
上一层级位置 = (当前层级位置 + 每次删除第k个元素) % 上一层级的元素长度;

我们先给出我们的前提,5个元素,每次淘汰第3个元素,如下图,下面㈠㈡㈢㈣㈤代表五个阶段,每次淘汰一个元素

㈠ 0 1 2 3 4 /  0 1 2 3 4

㈡ 3 4 0 1 /  3 4 0 1

㈢ 1 3 4 / 1 3 4 

㈣ 1 3 / 1 3

㈤ 3

我们先来达成一个共识

1、我们可以将元素的首尾拼接

比如说我有2个元素,我每次都删第3个元素,而我的元素长度不够怎么办,那就是数完3个元素后,继续从第1个元素开始轮起,像一个环一样,上面的示例,我弄了一个斜杠 表示环,如 中第一个 4 ,往后走就是 0

我们再来达成一个共识

2、最终留下的元素是一个确定的值

从上往下看,我每次都删第3个元素,而且元素的顺序长度是不变的 【0 1 2 3 4】,最后结果一定是一个确定值,不可能是随机的

从下往上看,(重点!!!)(我们定个规则,第一个元素的位置,叫做0号位置)

我们知道最终剩下的结果是3,3在0号位置,我们要保证最后3在0号位置,0号位置咋来的?就是(在上一阶段)它前面那个元素被淘汰了呗,被淘汰的下一个元素就是0号位置,这也是题目中的规则

我把公式抄下来

# 公式
上一层级位置 = (当前层级位置 + 每次删除第k个元素) % 上一层级的元素长度;

说明在 ㈣ 中,3的前面那个元素就是第三个元素

 框框中,刚好框起来前面三个元素(包括第三个元素),说明3只能排在1号位置在㈣中,在下一阶段, ㈤ 中3这个元素才会顺利排到0号位置 (因为第三个元素淘汰了,所以第三个元素【在下一阶段】后面的元素自然是0号位置)(换算成公式就是  (0+ 3)% 2  )【公式解释,在㈤, 0 是当前位置,3是每次淘汰第3个元素,是一个定值,2是上一阶段存活的元素个数,这个算出的结果就是下一阶段的位置】

我们再来看 ㈢ ,我们要保证3在㈣中能排在1号位置,那3在㈢中,应该排在哪呢

 注意我框框和下面下标,还是框起来三个元素,框框之后的,也就是第三个元素之后的,自然就是0号位置,而下一个位置就是1号位置啦,比如说4被淘汰了,那3在下一阶段自然就是1号位置啦(换算成公式就是  (1 + 3)% 3   )【公式解释, 1 是当前位置,在㈣,(前面那个)3是每次淘汰第3个元素,是一个定值,(后面那个)3是上一阶段存活的元素个数,这个算出的结果就是下一阶段的位置】

结论

以此类推,我们就能推出上面层级3的位置,这也就是公式中,括号里的内容 (当前层级位置 + 每次删除第k个元素) ,至于为啥会 % ,因为有环,从下往上看,其实位置也是定死的

所以这个公式能根据当前位置,推出它上级的位置

我们还可以拓展一下题目,换一下题目中的元素内容,还是每次淘汰第3个元素,如把 【0 1 2 3 4】换成

00 11 44 3 4

最后会剩下谁?我们根据验算,最后会剩下第四个位置的元素,也就是3,最后结果其实也是3,大家有兴趣可以试下

我们题目中刚好是连续非负整数,下次如果遇到上面的问题,应该也能答出来了吧?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值