390. Elimination Game
正规解法直接跳到代码上面一点的部分就可以了。但我想记录下自己的思考和尝试过程,希望二刷能看到问题所在。
找规律的时候写了好多,虽然规律很简单。
只要随便写3以上的例子,就应该发现,相邻的2个最后结果是一样的,n=8和n=9的结果都是6,n=10和n=11的结果都是8..
当时我的想法是,8 9消除2次之后就和4 5的消除情况一样,6 7和3 4一样,那既然需要用到前面的步骤,肯定是动态规划。 
然而,不管是DP[I]来自DP[I-2]还是来自DP[I/2]都似乎不正确,我相信如果每一轮都是从左往右削减,那就简单多了,甚至不用动态规划。
重新入手,第一次是每2个删除1个;
第二次在第一次的基础上每2个删除1个,其实就是每4个删除1个;
第三次就是每8个删除一个。
这样以来最后一个幸存的就是不是2 4 8 16...的倍数的,假如每次都从左删除。
这里的问题是从右往左消减太可恶了。

会改变。
最后的结果就是分情况讨论,每删除一轮,都记录从哪个元素开始删除。
换句话说,都记录最左边的元素是哪一个,至于下一次删不删除它,也跟各种情况有关。
就2种情况,左还是右。
左的话第一个元素稳死,下一次的第一个变为当前的下一个。
当前的下一个的计算方式是当前+跳过的个数,第一次跳过2个,第二次跳过4个,第三次8个。。
从右的话,还跟目前剩下元素的奇偶性有关,偶数左边第一个会被保留;基数左边第一个又嗝屁了。
总之就2种情况,第2种情况里又有2种。。比一开始想的简单多了。。
public class Solution
{
public int lastRemaining(int n)
{
if(n <= 1) return n;
int res = 1;
int left = n; // how many elements left(not eliminated)
int interval = 1; // elimination interval
boolean fromLeft = true; // elimination process begins from left to right?
while(left > 1) // until only 1 element left
{
if(fromLeft)
{
res += interval;
}
else
{
if(left % 2 == 0)
{
res = res;
}
else
{
res += interval;
}
}
left /= 2;
interval*=2;
fromLeft = !fromLeft;
}
return res;
}
}
代码里逻辑性的东西我习惯尽量能不省就不省,这样结构更清晰。 有些时候拼了命写在一行一大坨,可读性比较差,尤其是对于我这种智障来说。
390. Elimination Game的更多相关文章
- 【LeetCode】390. Elimination Game 解题报告(Python)
[LeetCode]390. Elimination Game 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/elimina ...
- [LeetCode] 390. Elimination Game 淘汰游戏
There is a list of sorted integers from 1 to n. Starting from left to right, remove the first number ...
- [leetcode] 390 Elimination Game
很开心,自己想出来的一道题 There is a list of sorted integers from 1 to n. Starting from left to right, remove th ...
- 390 Elimination Game 淘汰游戏
详见:https://leetcode.com/problems/elimination-game/description/ C++: 方法一: class Solution { public: in ...
- 【leetcode】390. Elimination Game
题目如下: 解题思路:对于这种数字类型的题目,数字一般都会有内在的规律.不管怎么操作了多少次,本题的数组一直是一个等差数列.从[1 2 3 4 5 6 7 8 9] -> [2 4 6 8] - ...
- LeetCode All in One 题目讲解汇总(持续更新中...)
终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
- LeetCode赛题390----Elimination Game
# 390. Elimination Game There is a list of sorted integers from 1 to n. Starting from left to right, ...
- LeetCode分类-前400题
1. Array 基础 27 Remove Element 26 Remove Duplicates from Sorted Array 80 Remove Duplicates from Sorte ...
随机推荐
- Qt程序开机启动的怪现象————无法正常显示程序皮肤
事情很简单:最近公司项目在做即时通讯软件,类似QQ.该软件应该支持开机启动这样的常用功能.但是实际上开发该功能的时候碰到了个问题:开机启动程序无法正常加载皮肤文件. 这个问题让我头疼了很久啊.最终确定 ...
- Java环境变量配置&解决版本不一致问题
之前用Myeclipse编译运行Java没有问题 但是突然想用简单点的NotePad++以及cmd直接编译运行Java 这就让我倒腾了一晚上 先说下问题的解决,再总结下查阅的一些知识. 1.进行win ...
- VS2008中MFC界面编程Caption中文全是乱码的解决办法 -转载
一.问题 在预览状态下可能看到中文,但是编译运行后对话框中的中文全是问号.即使你用的VS中文版,即使你也用了Unicode编码,即使有条件编译 #ifdef _WIN32LANGUAGE LANG_C ...
- C# Delegate 异步调用
namespace ConsoleApplication22 { /// /// 异步操作 /// /// /// /// //internal Func<int,int,int> int ...
- c#写个基础的Socket通讯
晚上想写点东西,想想把我刚来公司学的Sockt通讯写上来吧.要写的简单易懂点,新人们可以借鉴下哦,用控制台写. 先得说说Socket,与TCP/UDP啥关系,一直讲什么Socket通讯,TCP通讯,都 ...
- 运用预加载提升H5移动页面的用户体验
原文地址:http://www.grycheng.com/?p=2188 在做h5移动页面,相信大家一定碰到过页面已经打开,但是里面的图片还未加载出来的情况,这种问题虽然不影响页面的功能,但是不利于用 ...
- bzoj 3632: 外太空旅行 最大团
3632: 外太空旅行 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 389 Solved: 129[Submit][Status] Descript ...
- 怎么跳出MySQL的10个大坑
淘宝自从2010开始规模使用MySQL,替换了之前商品.交易.用户等原基于IOE方案的核心数据库,目前已部署数千台规模.同时和Oracle, Percona, Mariadb等上游厂商有良好合作,共向 ...
- 上网必备AdBlock,远离广告!
浏览器广告拦截插件,绝对上网必备... 从此告别讨厌的百度边栏广告!!! https://getadblock.com/ https://adblockplus.org/zh_CN/
- python functools模块
functools.partial 作用: functools.partial 通过包装手法,允许我们 "重新定义" 函数签名 用一些默认参数包装一个可调用对象,返回结果是可调用对 ...