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

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

只要随便写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. React学习笔记(二) 组件状态

    组件的状态(this.state): 组件免不了要与用户互动,React 的一大创新,就是将组件看成是一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染 UI getIni ...

  2. [Linux]命令行模式切换

    图形界面进入命令:Ctrl+Alt+T 进入终端命令:Ctrl+Alt+F1 or Ctrl+Alt+F2 切换至图形界面:按Alt+F7

  3. CANoe 入门 Step by step系列(一)基础应用【转】

    CANoe是Vector公司的针对汽车电子行业的总线分析工具,现在我用CANoe7.6版本进行介绍,其他版本功能基本差不多. 硬件我使用的是CAN case XL. 1,CANoe软件的安装很简单,先 ...

  4. Python 学习之urllib模块---用于发送网络请求,获取数据(2)

    接着上一次的内容. 先说明一下关于split()方法:它通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串(把一个字符串分割成很多字符串组成的list列表) 语法: ...

  5. Cannot open your terminal '/dev/pts/4' - please check.

    使用screen命令的时候出现了下面的错误 Cannot open your terminal '/dev/pts/4' - please check. 可以使用script命令来记录这个终端会话, ...

  6. WPF之 XAML集合项简单演示

    我们直接通过xaml文件演示一个简单的xaml集合项: <Window x:Class="WPF_XAML集合项.MainWindow" xmlns="http:/ ...

  7. Js 简单分页(一)

    网上有很多分页的插件 但是没有自己想要的 上代码吧,只有分页部分代码,css 省略了 html <div class="bar2 fr" id="pagecontr ...

  8. Encoding 类别

    Encoding 類別 .NET Framework 4.5   表示字元編碼方式. 繼承階層架構 System.Object   System.Text.Encoding    System.Tex ...

  9. JSON取代XML?--JSON入门指南

    定义 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C# ...

  10. bzoj 3669: [Noi2014]魔法森林 动态树

    3669: [Noi2014]魔法森林 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 363  Solved: 202[Submit][Status] ...