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 ...
随机推荐
- Sublime Text 3配置LiveReload实现实时刷新
今天看到一款很强大的插件,LiveReload,实时刷新,也就是说写完html/css/js等不用再到浏览器里按F5啦,在Ctrl+S时浏览器会自动刷新,是不是想想都很爽... Chrome:(据说支 ...
- jQuery仿苏宁易购导航
最近看了些网上的各类导航网站源码,自己学习制作了一个仿苏宁易购的导航栏 jQuery部分代码 $(function(){ $(".CategoryTree>ul>li" ...
- php解决下单、抽奖并发导致的库存负数的问题
我们知道数据库处理sql是一条条处理的,假设购买商品的流程是这样的: sql1:查询商品库存 if(库存数量 > 0) { //生成订单... sql2:库存-1 } 当没有并发 ...
- Python【第一篇】基础介绍
一.本节主要内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc文件 数据类型初识 数据运算 表达式if ...else语 ...
- #Leet Code# Binary Tree Max[待精简]
描述:递归调用,getMax返回 [节点值,经过节点左子节点的最大值,经过节点右节点的最大值],每次递归同时查看是否存在不经过节点的值大于max. 代码:待优化 def getLargeNode(se ...
- 2016030201 - github上创建项目
具体步骤如下: 前提是你已经由github账户,登陆你的账户后 步骤1:点击右下角+new repository 2.添加代码库描述内容,比如reposltory name 例如我创建的内容 3.点击 ...
- AlertDialog中EditText不能获取焦点以及不宽度不能自动铺满的完美解决方案
问题分析: 因为 dialog的Attributes使用的默认的,其中一个属性就是:flags ,就是这个属性导致不能获取焦点,默认的是FLAG_NOT_FOCUSABLE,故名思义不能获取输入焦点, ...
- SpringMVC源码阅读(二)
今天分析下ViewResolver和View的实现 下面是ModelAndView的实现 package org.springframework.web.servlet; import java.u ...
- iOS:不同属性声明方式的解析
代码: /* 属性声明方式说明: ----------------------- 1 @interface ... { id name } @end 这样声明的属性其实可以认为是private属性,因 ...
- Linux 继续进阶
http://www.cnblogs.com/uhasms/archive/2011/11/15/2250474.html http://www.cnblogs.com/alexyuyu/articl ...