解题思路:
看似很麻烦的一道题目,如果运用数学的归纳法,将会非常简单。说白了就是找规律,但是其中的规律可以证明,证明过程请看阿飞大佬的这篇帖子,假设前向消除为f(n),反向消除为b(n),总结为3点:
- f(n)+b(n)=n+1;
- 当n为1时,f(n)=b(n)=1;
- f(n)=2*b(n/2);
代码如下:
class Solution {
public:
int lastRemaining(int n) {
return n == 1 ? 1 : 2 * (n / 2 + 1 - lastRemaining(n / 2));
}
};