我们这里重点在于递归思想和解题的重心,即利用递归解决一系列算法题。
我们在学习数据结构 / 做算法题时,如二叉树、快排,归并等,会使用递归写代码。
我们知道:递归就是函数调用自身的情况。
而我们在写一个递归函数时,分为两个部分:终止条件(函数出口)和递归体
递归的本质 可以理解为:对于一个主问题,其可以分为多个相同的子问题,而每个子问题也可以继续分为相同的子问题(递归是一种通过将问题分解为更小规模的相同问题来解决主问题的方法),
因此在我们遇到这类问题时,可以尝试使用递归去解题。
思路
我们可以将上面的子问题看作:将X柱的盘子通过Y柱放到Z柱
根据上面的思路,我们进行代码的编写:
代码
class Solution {
public:
void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
dfs(A, B, C, A.size());
}
void dfs(vector<int>& a, vector<int>& b, vector<int>& c, int n) {
if(n == 1) // 退出条件 : 将a上最后一个盘子加到c中
{
c.push_back(a.back());
a.pop_back();
return;
}
// 左柱借助右柱将n-1个盘子到中柱
dfs(a, c, b, n-1);
// 执行移动盘子
c.push_back(a.back());
a.pop_back();
// 中柱借助左柱将n-1盘子到右柱
dfs(b, a, c, n-1);
}
};
思路
代码
class Solution {
public:
ListNode* dfs(ListNode* l1, ListNode* l2) {
if(l1 == nullptr) return l2; // 函数出口
if(l2 == nullptr) return l1;
// 每次取一个做头节点
if(l1->val < l2->val)
{
l1->next = dfs(l1->next, l2);
return l1;
}
else
{
l2->next = dfs(l1, l2->next);
return l2;
}
}
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
return dfs(list1, list2);
}
};
思路
代码
ListNode* reverseList(ListNode* head) {
if(!head || !head->next) return head;
ListNode* newHead = reverseList(head->next); // 找到叶子节点前一位,开始逆置
// 将next节点指向该节点,该节点指向空
// 随后向上返回
head->next->next = head;
head->next = nullptr;
return newHead;
}
思路
根据图中思路,两两交换节点后,新头节点应该是两节点中的右侧节点
tmp = swapPairs(head->next->next)
,即交换后面的节点并每次链接新头节点代码
ListNode* swapPairs(ListNode* head) {
if(head == nullptr || head->next == nullptr)
return head;
// 递归
auto tmp = swapPairs(head->next->next); // 翻转后的前一位节点
auto ret = head->next; // 新头节点
head->next->next = head; // 更改指针指向
head->next = tmp;
return ret;
}
思路
题意分析:题目要求实现pow(x, n)用于实现x的n次幂
通过上面的分析,我们知道:
以此实现函数:
double _myPow(double x, long long n)
,不用解释代码
class Solution {
public:
double myPow(double x, int n) {
return _myPow(x, (long long)n);
}
double _myPow(double x, long long n) {
if(n == 0) return 1;
if(n < 0) // n为负数,负数指数的幂可以通过对正数指数的幂取倒数得到
{
n = -n;
x = 1 / x;
}
// 偶数:x^n = x^(n/2) * n^(n/2)
// 奇数:x^n = x^(n/2) * n^(n/2) * x
double tmp = _myPow(x, n / 2);
return n % 2 == 0 ? tmp * tmp : tmp * tmp * x;
}
};