正规解法直接跳到代码上面一点的部分就可以了。但我想记录下自己的思考和尝试过程,希望二刷能看到问题所在。

找规律的时候写了好多,虽然规律很简单。

只要随便写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的更多相关文章

  1. 【LeetCode】390. Elimination Game 解题报告(Python)

    [LeetCode]390. Elimination Game 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/elimina ...

  2. [LeetCode] 390. Elimination Game 淘汰游戏

    There is a list of sorted integers from 1 to n. Starting from left to right, remove the first number ...

  3. [leetcode] 390 Elimination Game

    很开心,自己想出来的一道题 There is a list of sorted integers from 1 to n. Starting from left to right, remove th ...

  4. 390 Elimination Game 淘汰游戏

    详见:https://leetcode.com/problems/elimination-game/description/ C++: 方法一: class Solution { public: in ...

  5. 【leetcode】390. Elimination Game

    题目如下: 解题思路:对于这种数字类型的题目,数字一般都会有内在的规律.不管怎么操作了多少次,本题的数组一直是一个等差数列.从[1 2 3 4 5 6 7 8 9] -> [2 4 6 8] - ...

  6. LeetCode All in One 题目讲解汇总(持续更新中...)

    终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...

  7. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

  8. LeetCode赛题390----Elimination Game

    # 390. Elimination Game There is a list of sorted integers from 1 to n. Starting from left to right, ...

  9. LeetCode分类-前400题

    1. Array 基础 27 Remove Element 26 Remove Duplicates from Sorted Array 80 Remove Duplicates from Sorte ...

随机推荐

  1. AngularJS cookie的使用

    Javascript使用document.cookie接口来处理简单的文本cookie,但现在大多数现代浏览器都可以使用html5 API了(sessionstorage和localstorage), ...

  2. 通过css实现文本超出部分以省略号(......)代替

    一.单行溢出 1,固定宽度(非常容易) text-overflow: ellipsis; 2,不固定宽度 思路:想让这个区域成为块元素,然后不换行,溢出隐藏. display: block; whit ...

  3. 关于 const 成员函数

    成员函数如果是const意味着什么? 有两个流行概念:物理常量性和逻辑常量性. C++对常量性的定义采用的是物理常量性概念,即const 成员函数不可以更改对象内任何non-static成员变量.例如 ...

  4. Java学习----有风险的代码(异常)

    Exception继承了Throwable,但是它本身是有异常类的父类. RuntimeException:运行时异常 Exception->RuntimeException->NullP ...

  5. css字体大小设置em与rem的区别

    em 单位em是相对于父元素的,如果父元素没有设置字体大小,那就会追溯到body. 比如  如果我在box_text的父元素box加了一个字体大小   那么body的8px就会被box_text的父元 ...

  6. strtotime 的几点不同

    在php里面,strtotime()有点比较特殊,date函数也有点问题 if ( date(1,time()) == "Monday")    //似乎 date(1,time( ...

  7. 【python】闰年规则

    公历闰年判定遵循的规律为: 四年一闰,百年不闰,四百年再闰. 公历闰年的简单计算方法(符合以下条件之一的年份即为闰年)1.能被4整除而不能被100整除.2.能被400整除.

  8. 浅谈Exchange 2013开发-如何操作邮件的附件

    因为项目中客户有一个的要求,所以这个Exchange前段时间搞的我很是头疼,没接触过这个东西,但是现在看来,纸老虎一个.希望我的经验可以帮助初次接触它的人少走一些弯路! 简单介绍一下:客户要求在自己的 ...

  9. 常用machine learning数据集

    ImageNet:非商业化的可视化大数据 截止到2015年5月1日,ImageNet数据库拥有超过1500万的图像. cifar10:10类物体识别数据集 数据集中包含60,000幅32*32图像,共 ...

  10. 【HTTP】HTTP access control (CORS)

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS Cross-site HTTP requests are H ...