leetcode每日一题 390.消除游戏
- 题目链接:
390.消除游戏
- 题解:
考虑记录三个状态 ,就可以确定整个列表arr,
我们分别记录列表左端点l,右端点r,以及步长len,
初始时状态有l = 1,r = n,len = 1;
考虑从左向右删除时,会转移到l1 = l + len,r1 = r : r - len ? (r - l)%(2 * len) != 0,len1 = 2 * len
从右向左类似
通过这样不断转移最后到达l >= r的时候返回r即可
- 代码:
int lastRemaining(int n)
{
int l = 1, r = n, len = 1;
int o = 0;
while(l < r)
{
if(o == 0)
{
if((r - l) % (2 * len) == 0) r = r - len;
l = l + len;
}
else
{
if((r - l) % (2 * len)== 0) l = l + len;
r = r - len;
}
len = len * 2;
printf("%d %d %d\n",l,r,len);
o ^= 1;
}
return r;
}