线性搜索肯定是会超时的
写了几个数列,发现是有规律的,可以递归转化为子问题
分成这几种情况:
1、从左往右
1)数列末尾是奇数
2)数列末尾是偶数
2.从右往左
1)数列末尾是奇数
2)数列末尾是偶数
按照这几种情况进行约减,每次迭代后原数组都变成之前的一半大小(迭代的时候会除以2),所以时间复杂度是logn
class Solution {
public:
int lastRemaining(int n) {
return f(n);
}
int f (int n) { //从左往右
if (n == 1) return 1;
if (n == 2) return 2;
if (n & 1 == 1) {
return 2*g((n-1)/2);
}
else {
return 2*g(n/2);
}
}
int g (int n) { //从右往左
if (n == 1) return 1;
if (n == 2) return 1;
if (n & 1 == 1) {
return 2*f((n-1)/2);
}
else {
return 2*f(n/2)-1;//这里需要减一,写几个数列这部分才好理解
}
}
};