第一次删除时,所有数字都是偶数,除以2之后,得到了1~n/2的连续数组。
对于1~n/2的序列,从右向左删除,原来的结果为该lastRemaining(n/2)镜像结果的两倍。
class Solution {
public:
int lastRemaining(int n) {
if (n == 1)
return 1;
// 1 2 3 4 5 ... n
// TO
// 2*1 2*2 2*3 ... 2*(n/2)
//
// remain: 1 2 3 ... n/2 的结果
int remain = lastRemaining(n/2);
// 从右向左删除,取remain对称的结果
int remain_mirror = (1 + n/2) - remain;
// 还原成2倍
return remain_mirror * 2;
}
};