leetcode.390 消除游戏

390.消除游戏——题目描述

给定一个从1 到 n 排序的整数列表。
首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾。
第二步,在剩下的数字中,从右到左,从倒数第一个数字开始,每隔一个数字进行删除,直到列表开头。
我们不断重复这两步,从左到右和从右到左交替进行,直到只剩下一个数字。
返回长度为 n 的列表中,最后剩下的数字。

链接:[力扣-LeetCode](https://leetcode-cn.com/problems/elimination-game)

原题中的示例

输入:n = 9
1 2 3 4 5 6 7 8 9
2 4 6 8
2 6
6
输出:6

解法一

也即传统的解法,按照题目给的顺序,逐个删除序列中对应位置的数字。这样下来,n比较小的情况,复杂度还能接受。一旦n比较大,则无法通过测试。

解法二

思路参考自:https://blog.csdn.net/afei__/article/details/83689502
但是在下认为原作的推导和有部分需要补充,因此在本贴中进行了完善。下面正式讨论该解法:
首先,我们看看能不能从序列和输入输出当中找出点规律。
给定n, 假设f(n)为序列从左到右的最终结果,g(n)为序列从右到左的最终结果。
当n=1时,f(n)=g(n)=1;当n>1时,观察发现,存在如下两个等式:
(1) f(2n) = 2g(n)
(2) g(2n) = 2
f(n)-1

要证明这两个等式成立,很简单,证明如下:
(1)假设原序列s0=[1,2,3,…,n], 现有序列:s1=[1,2,3,4,…,2n]. 对序列s1进行一次从左到右操作后,剩余的序列为:s2=[2,4,…,2n]. 观察序列s0和s2可知,由于两个序列长度都为n,且之后两个序列的操作一致,所以得到的结果:result(s1)=2result(s2),也即 f(2n)=2g(n).

s0=[1,2,3,…, n]
s2=[2,4,6,…,2n]

(2) 对序列s0中每一元素都乘2,得s3=[2,4,6,…,2n]. 对序列s1进行一次从右到左操作后,剩下的序列为:s4=[1,3,5,…,2n-1]. 观察序列s3和s4可知,由于两个序列长度都为n,且之后两个序列的操作一致,所以得到的结果:
result(s3)=result(s4)-1,也即 g(2n)=2*f(n)-1.

s3=[1,3,5,…,2n-1]
s4=[2,4,6,…, 2n]

有了这两个等式,我们再观察序列:

n = 1 时,f(n) = 1,g(n) = 1,存在f(n) + b(n) = n + 1 = 2
n = 2 时,f(n) = 2, g(n) = 1,存在 f(n) + b(n) = n + 1 = 3
n = 3 时,f(n) = 2, g(n) = 2,存在 f(n) + b(n) = n + 1 = 4
n = 4 时,f(n) = 2, g(n) = 3,存在 f(n) + b(n) = n + 1 = 5

也即,当n<=4时,满足f(n)+g(n)=n+1.

根据数学归纳法,只要我们能够证明等式 f(2n)+g(2n)=2n+1成立,就能是等式对于所有偶数n成立.下面是证明过程:
f(2n)+g(2n) = 2g(n)+[2f(n)-1] = 2[g(n)+f(n)]-1=2(n+1)-1=2n+1
所以,f(2n)+g(2n) = 2n+1 成立

对于基数序列,假设最后以为数为2k+1(k=1,2,…), 观察可知,f(2k+1)=f(2k),也即所有输入为奇数的n值得到的结构,与偶数值n-1相同。至此,等式f(n)+g(n)=n+1对所有正整数成立.对该等式进行变型,得:
f(n)=n+1-g(n)=n+1-[2f(n/2)-1]=2[n/2-f(n/2)+1], (n>1)
g(n)=n+1-f(n)=n+1-2g(n/2), (n>2)

java代码实现

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值