一、 问题本质分析
每次对折都会在原有折痕序列的每对相邻折痕之间插入新的折痕,形成如下规律:
二、算法设计思路
递归建模:将每次折叠视为二叉树的生长
左子树代表新产生的下折痕
右子树代表新产生的上折痕
中序遍历:按照"左-根-右"的顺序访问节点
三、 复杂度分析
时间复杂度:O(2^n) 每个节点访问一次
空间复杂度:O(n) 递归栈深度
四、完整代码
class FoldPaper { public: vector<string> foldPaper(int n) { vector<string> res; if (n < 1) return res; // 边界条件处理 // 模拟折纸过程,实际上是中序遍历二叉树 inOrder(1, n, true, res); // 根节点是下折痕 return res; } // 递归实现的中序遍历 void inOrder(int i, int n, bool isDown, vector<string>& res) { if (i > n) return; // 递归终止条件 inOrder(i + 1, n, true, res); // 遍历左子树(总是下折痕) res.push_bACk(isDown ? "down" : "up"); // 当前节点 inOrder(i + 1, n, false, res); // 遍历右子树(总是上折痕) }};
来源:大矩学习资料
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦