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题顺 ...
随机推荐
- 状态机模式中的Task与对象池
Task 抽象带来Task 首先,假设我们有这么一段逻辑:收到一个参数,先校验格式是否正确,再提取相关的参数出来,执行我们的事务,然后构建结果并返回.伪代码如下: /** * 一个engine类 ** ...
- Java中HashMap的hash分布策略的简单解释
趴源码是看到一段不可思议的代码,网上的解释似乎不大令人满意,因此稍微花点时间解读了一下,如有错误请指正 HashMap的桶是这样搞的 // 片段1 static final int hash(Obje ...
- Mac 10.12安装IntelliJ出品的数据库管理工具DataGrip
下载: (链接: https://pan.baidu.com/s/1nvJw88T 密码: srv2) 安装参考: http://www.cnblogs.com/EasonJim/p/7868645. ...
- Git学习系列之Git基本操作拉取项目(图文详解)
前面博客 Git学习系列之Git基本操作推送项目(图文详解) 当然,如果多人协作,或者多个客户端进行修改,那么我们还要拉取(Pull ... )别人推送到在线仓库的内容下来. 大神们是不推荐使用 pu ...
- mac环境下使用docker安装nginx
前言 距离上一篇文章已经很长时间,近期实在事情太多了,也没来得及继续更新一些新的内容.现在开发使用的工作实在太多了,小编实在忍受不了windows那样卡机的状态,于是最近换了一个mac电脑,虽然做开发 ...
- python-Unix套接字
#!/usr/bin/python #coding=utf-8 #server import socket import sys import os server_address = './test' ...
- linux mint 18.2 install postgresql
https://www.postgresql.org/download/linux/ubuntu/ 1 check Xenial16.04 2 创建文件 /etc/apt/sources.list ...
- hibernate与ibatis的区别
Hibernate 是当前最流行的O/R mapping框架,当前版本是3.05.它出身于sf.net,现在已经成为Jboss的一部分了 iBATIS 是另外一种优秀的O/R mapping框架,当前 ...
- C#中使用Log4Net记录日志
https://www.cnblogs.com/W--Jing/p/8125652.html 实例参考 https://www.cnblogs.com/soundcode/p/4866078.html ...
- [javaSE] 数据结构(栈)
栈(stack)是一种线性存储结构,有以下特点: 1.栈中数据是按照先进后出的方式进出栈的 2.向栈中添加删除元素时,只能从栈顶进行操作 使用数组实现栈 定义一个类ArrayStack 实现入栈方法p ...