LeetCode赛题390----Elimination Game
390. Elimination Game
There is a list of sorted integers from 1 to n. Starting from left to right, remove the first number and every other number afterward until you reach the end of the list.
Repeat the previous step again, but this time from right to left, remove the right most number and every other number from the remaining numbers.
We keep repeating the steps again, alternating left to right and right to left, until a single number remains.
Find the last number that remains starting with a list of length n.
Example
Input:
n = 9,
1 2 3 4 5 6 7 8 9
2 4 6 8
2 6
6
Output:
6
算法分析
首先可以想到的最原始的一个方法就是构造一个列表,一遍一遍地来回删除其中的元素,直到列表里只剩下一个元素。
但这显然不是问题的设计的初衷。
首先设输入数据为 n 时,最终结果为 f(n).很显然,有 f(1)=1,f(2)=2.
当 n=2k 时,从1,3,5,... ,2k-1 删除奇数项后,剩余的是2,4,6,... ,2k, 共 k 个偶数项。
当 n=2k+1 时,从1,3,5,... ,2k-1 ,2k+1 删除奇数项后,剩余的是2,4,6,... ,2k, 共 k 个偶数项。
这两种情况在从左到右删除一遍后,剩下的内容相同,所以最终剩下的一项也相同,所以我们可以得出结论:
f(2k+1)=f(2k)
所以,我们只需考虑 n 为偶数的情况。
假设 n=n1=k (k=1,2,3,...)时,f(n1)=m1,那么当n=n2=2*n1=2k (k=1,2,3,...)时,从左到右第一遍删除奇数后,还剩下 k 个偶数,此时从右往左删除,情况跟n=n1时从左往右开始删除类似,则最终剩下的是从 2k 往左数第 m1 个偶数,所以f(n2)=n2-2*(m1-1),即:
f(2k)=2k-2*f(k)+2
同理,有
f(2(k+1))=2(K+1)-2*f(2^k)+2
对上式两边同时除以 2^(k+1),有:
f(2(K+1))/2(k+1)= - f(2k)/2k +1/2^k + 1.
记 g(k)=f(2k)/2k,则:
g(k+1)= -g(k)+1/2^k+1.
由于上式两边函数项正负号不同,难以推出通项公式,所以我们需要进一步推理,有:
g(k+1)
= -g(k)+1/2^k+1
= -[-g(k-1)+1/2^(k-1)+1] + 1/2^k +1
= g(k-1)-1/2^k
且有 g(0)=f(1)/1=1, g(1)=f(2)/2=1.
则:
(i) 当 k=2m (m=1,2,3,...) 时,有:
g(2m)
=g(2m-2)-1/2^(2m-1)
=g(2m-4)-1/2(2m-3)-1/2(2m-1)
=g(2m-6)-1/2(2m-5)-1/2(2m-3)-1/2^(2m-1)
=...
=g(0)-1/21-1/23-1/25-...-1/2(2m-1)
=1-(2-2/4^m)/3
=(2/4^m+1)/3
当取m=0时,g(2m)=1=g(0),所以,当 k=2m (m=0,1,2,3,...)时,g(2m)=(2/4^m+1)/3
(ii) 当 k=2m+1 (m=1,2,3,...) 时,有:
g(2m+1)
=g(2m-1)-1/2^(2m)
=g(2m-3)-1/2(2m-2)-1/2(2m)
=...
=g(1)-1/22-1/24-1/26-...-1/2(2m)
=1-(1-1/4^m)/3
=(1/4^m+2)/3
当取m=0时,g(2m+1)=1=g(1),所以,当 k=2m+1 (m=0,1,2,3,...)时,g(2m+1)=(1/4^m+2)/3
又因为 f(2k)=2k*g(k),所以,对于给定的 n ,当 n 为2^k时,我们可以根据k是奇数还是偶数得出f(n)的公式。即:
(i) 当 n=2^(2m) (m=0,1,2,3,...)时,有:
f(n)
=f(2^(2m))
=2^(2m)*g(2m)
=n*(2/4^m+1)/3
=(n+2)/3
(ii) 当 n=2^(2m+1) (m=0,1,2,3,...)时,有:
f(n)
=2^(2m+1)*g(2m+1)
=n*(1/4^m+2)/3
=(2n+2)/3
所以,对于输入的 n ,如果是 1,我们直接返回1 。否则,判断其是否为偶数,如果不是,则将其做减1处理,因为 f(2k+1)=f(2k).此时保证n为偶数。
然后判断 n 是否为 2^k,如果是,则根据上面推理出的公式进行计算;如果不是,则递归计算 f(n/2) ,因为 f(n)=n-2f(n/2)+2.
代码如下:
Java算法实现
public class Solution {
public int lastRemaining(int n) {
if(n==1)
return 1;
if(n==2)
return 2;
if((n&0x1)==0x1){
n--;//化为偶数,因为 f(2k+1)=f(2k)
}
if(((n-1)&n)==0){
//为2的整数幂
int index=0;
int tmpN=n;
tmpN=tmpN>>>1;
while(tmpN>0){
//n=2^k,此处用 index 表示k的值
index++;
tmpN=tmpN>>>1;
}
int ans=0;
if((index&1)==1){
//index为奇数
//对应f(n)=(2n+2)/3,此处 tmpN=2n
tmpN=n<<1;
}
else{
//index为偶数
//对应f(n)=(n+2)/3,此处 tmpN=n
tmpN=n;
}
ans=(tmpN+2)/3; //tmpN=n 或 tmpN=2n
return ans;
}
else{
//n不是2的整数幂,但目前已经能保证n为偶数,递归计算
int tmpAns=lastRemaining(n>>>1);
int ans=n-2*tmpAns+2;
return ans;
}
}
}
LeetCode赛题390----Elimination Game的更多相关文章
- LeetCode赛题515----Find Largest Element in Each Row
问题描述 You need to find the largest element in each row of a Binary Tree. Example: Input: 1 / \ 2 3 / ...
- LeetCode赛题----Find Left Most Element
问题描述 Given a binary tree, find the left most element in the last row of the tree. Example 1: Input: ...
- LeetCode赛题395----Longest Substring with At Least K Repeating Characters
395. Longest Substring with At least K Repeating Characters Find the length of the longest substring ...
- LeetCode赛题394----Decode String
394. Decode String Given an encoded string, return it's decoded string. The encoding rule is: k[enco ...
- LeetCode赛题393----UTF-8 Validation
393. UTF-8 Validation A character in UTF8 can be from 1 to 4 bytes long, subjected to the following ...
- LeetCode赛题392---- Is Subsequence
392. Is Subsequence Given a string s and a string t, check if s is subsequence of t. You may assume ...
- LeetCode赛题391----Perfect Rectangle
#391. Perfect Rectangle Given N axis-aligned rectangles where N > 0, determine if they all togeth ...
- 【LeetCode】390. Elimination Game 解题报告(Python)
[LeetCode]390. Elimination Game 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/elimina ...
- 这样leetcode简单题都更完了
这样leetcode简单题都更完了,作为水题王的我开始要更新leetcode中等题和难题了,有些挖了很久的坑也将在在这个阶段一一揭晓,接下来的算法性更强,我就要开始分专题更新题目,而不是再以我的A题顺 ...
随机推荐
- Java NIO学习与记录(八): Reactor两种多线程模型的实现
Reactor两种多线程模型的实现 注:本篇文章例子基于上一篇进行:Java NIO学习与记录(七): Reactor单线程模型的实现 紧接着上篇Reactor单线程模型的例子来,假设Handler的 ...
- bingoyes' tiny dream
Gauss Elimination bool Gauss(){ int now=1,nxt; double t; R(i,1,n){ //enumerate the column for(nxt=no ...
- 洛谷 P4774 / loj 2721 [NOI2018] 屠龙勇士 题解【同余】【exgcd】【CRT】
推导过程存在漏洞+exCRT板子没打熟于是期望得分÷实际得分=∞? 题目描述 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号 \(1\sim n\) 顺序杀掉 \(n\ ...
- 思维导图让 Spring MVC 不再难懂
spring mvc简介与运行原理 Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器 ...
- python笔记02-----字符串操作
python中定义变量的字符串 str1 = "www" #str1就是字符串了 一定用引号 或者直接使用"字符串."来调用内部的方法 1.字符串大小 ...
- Java接口的简单理解和总结
1.抽象层次:普通类 -> 抽象类 -> 接口 普通类:就是我们常用的类: 抽象类:专门用来被子类继承的,主要是为了符合现实世界的规律 如: Animal类:(每个现实的对象都有类与它相对 ...
- 第七章、Linux 文件与目录管理
第七章.Linux 文件与目录管理 1. 目录与路径 1.1 相对路径与绝对路径 1.2 目录的相关操作: cd, pwd, mkdir, rmdir 1.3 关於运行档路径的变量: $PATH ...
- android的计算器
今天我闲着无聊,便想仿照Iphone的计算器自己写一个出来玩玩,于是就开动脑经,来场头脑风暴了!我拿什么了写呢?wp?这是个不错的选择,但是我最近在研究安卓的开发(求各位MSP不要烧我,我买不起MAC ...
- jar 不是内部或外部命令 CLASS_PATH设置
JDK安装没有问题,%JAVA_HOME% 和 path %JAVA_HOME%\bin 设置都没有问题 设置CLASS_PATH CLASS_PATH .;%JAVA_HOME%\l ...
- 仿淘宝商品详情页上拉弹出新ViewController
新项目就要开始做了,里面有购物那块,就试着先把淘宝商品详情页的效果做了一下. 1.需求 1.第一次上拉时,A视图拉到一定距离将视图B从底部弹出,A视图也向上 2.显示B视图时下拉时,有刷新效果,之后将 ...