【220102】390. 消除游戏

题目:https://leetcode-cn.com/problems/elimination-game/
笔记 from 【宫水三叶】约瑟夫环运用题

思路一:约瑟夫环

对称性
由于从左往右从右往左分别为从左端点发起,间隔删除从右端点发起,间隔删除,因此整个删除过程在连续序列中[1,n]中具有对称性,两者最终剩余的编号在连续序列中也具有对称性。

公式一
f 左 ( n ) + f 右 ( n ) = n + 1 f_左(n) + f_右(n) = n+1 f(n)+f(n)=n+1

  • 定义 f 左 ( n ) f_左(n) f(n) 为在连续序列 [1,n] 中进行起始从左到右的轮流换向间隔删除,最终左边剩余的编号。
  • 定义 f 右 ( n ) f_右(n) f(n) 为在连续序列 [1,n] 中进行起始从右到左的轮流换向间隔删除,最终右边剩余的编号。

【理解对称性】
比如,求1到100的和。
1和100关于50的位置对称,这样对称的一对共有50对。
每一对相加都是 1 + 100 = 101 。
和 = 101 * 50 = 5050 。

公式二
f 左 ( n ) = f 右 ( n 2 ) ∗ 2 f_左(n) = f_右(\frac{n}{2}) * 2 f(n)=f(2n)2
当我们对连续序列 [1, 2, 3, … , n] 执行了一次从左往右的消除之后,得到的序列为 [2, 4, 6, … , i] ,新序列的长度为 n 2 \frac{n}{2} 2n,且新序列起始变为从右往左

最终公式
f 左 ( n ) = 2 ∗ ( n 2 + 1 − f ( n 2 ) ) f_左(n) = 2*( \frac{n}{2} + 1 - f(\frac{n}{2}) ) f(n)=2(2n+1f(2n))
代码

class Solution {
    public int lastRemaining(int n) {
        return n == 1 ? 1 : 2 * (n / 2 + 1 - lastRemaining(n / 2));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值