刚开始看这道题的时候,没有思路,本打算通过求解前几个数字,得到规律性的结论,失败了。所以打算暴力求解,但估摸着时间复杂度和空间复杂度都非常高,应该AC不了,于是参考了discuss,amazing。。利用了处理完的数组永远是个等差数列的特性,存储开头,步长和长度就可以完全表示一个等差数列了。
class Solution {public: int lastRemaining(int n) { int start=1; int step=1; int length=n; bool isLeft=true; while(length!=1) { if((isLeft==true)||(isLeft==false&&(length%2==1))) start+=step; step*=2; length/=2; isLeft=!isLeft; } return start; }};新闻热点
疑难解答