
第一次删除时,所有数字都是偶数,除以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;
}
};
本文深入探讨了一种递归算法的实现原理,通过具体实例详细解释了如何使用递归解决特定数学问题,即在一个序列中按特定规则进行元素的删除与保留。文章首先介绍了基本的递归思想,然后逐步分析了算法的每一步操作,最后给出了完整的C++代码实现。
3155

被折叠的 条评论
为什么被折叠?



