当前位置: 首页 > web >正文

【递归、搜索与回溯算法】专题一 递归

文章目录

  • 0.理解递归、搜索与回溯
  • 1.面试题 08.06.汉诺塔问题
    • 1.1 题目
    • 1.2 思路
    • 1.3 代码
  • 2. 合并两个有序链表
    • 2.1 题目
    • 2.2 思路
    • 2.3 代码
  • 3.反转链表
    • 3.1 题目
    • 3.2 思路
    • 3.3 代码
  • 4.两两交换链表中的节点
    • 4.1 题目
    • 4.2 思路
    • 4.3 代码
  • 5. Pow(x, n) - 快速幂
    • 5.1 题目
    • 5.2 思路
    • 5.3 代码

0.理解递归、搜索与回溯

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.面试题 08.06.汉诺塔问题

1.1 题目

题目链接
在这里插入图片描述

1.2 思路

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

1.3 代码

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){c.push_back(a.back());a.pop_back();return;}dfs(a, c, b, n - 1);c.push_back(a.back());a.pop_back();dfs(b, a, c, n - 1);}
};

2. 合并两个有序链表

2.1 题目

题目链接
在这里插入图片描述
在这里插入图片描述

2.2 思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 代码

class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if(l1 == nullptr) return l2;if(l2 == nullptr) return l1;if(l1->val < l2->val){l1->next = mergeTwoLists(l1->next, l2);return l1;}else{l2->next = mergeTwoLists(l1, l2->next);return l2;}}
};

3.反转链表

3.1 题目

题目链接
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

3.2 思路

在这里插入图片描述
在这里插入图片描述

3.3 代码

class Solution {
public:ListNode* reverseList(ListNode* head) {if(head == nullptr || head->next == nullptr) return head;ListNode* newHead = reverseList(head->next);head->next->next = head;head->next = nullptr;return newHead;}
};

4.两两交换链表中的节点

4.1 题目

题目链接
在这里插入图片描述
在这里插入图片描述

4.2 思路

在这里插入图片描述
在这里插入图片描述

4.3 代码

老方法-迭代

class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head == nullptr || head->next == nullptr) return head;ListNode* newhead = new ListNode(0);newhead->next = head;ListNode* prev = newhead, * cur = head, * next = head->next, * nnext = next->next;while(cur && next){// 交换节点prev->next = next;next->next = cur;cur->next = nnext;// 移动prev、cur、next、nnextprev = cur;cur = nnext;if(cur) next = cur->next;if(next) nnext = next->next;}prev = newhead->next;delete newhead;return prev;}
};

新方法-递归

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head == nullptr || head->next == nullptr) return head;ListNode* tmp = swapPairs(head->next->next);ListNode* newhead = head->next;head->next->next = head;head->next = tmp;return newhead;}
};

5. Pow(x, n) - 快速幂

5.1 题目

题目链接
在这里插入图片描述

5.2 思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.3 代码

方法一

class Solution {
public:double myPow(double x, int N) {double ret = 1;long long int n = N;// 如果 n 是负数,将其转换为正数(即取绝对值),并将底数 x 变为  1/xif(n < 0){n = -n;x = 1/x;}while(n){// 检查 n 的最低位是否为 1(通过 n & 1 判断)。如果是 1,则将当前的 x 乘到 ret 中。这是因为当前位对应的幂需要被累乘到结果中。if(n & 1)ret *= x;// 将 x 平方(即 x *= x),相当于将指数翻倍。// 将 n 右移一位(即 n >>= 1),相当于去掉当前最低位,处理下一位。x *= x;n >>= 1;}return ret;}
};

方法二 - 递归

class Solution {
public:double myPow(double x, int n) {// -2^31 <= n <= 2^31// 当n是负的很大的数时,会越界,所以需要将N强转成long longreturn n > 0 ? Pow(x, n) : Pow(1/x, - (long long)n);     }double Pow(double x, int n){if(n == 0) return 1.0;double tmp = Pow(x, n/2);return n % 2 == 0 ? tmp * tmp : tmp * tmp * x;}
};
http://www.xdnf.cn/news/9304.html

相关文章:

  • 从大模型加载到交互:3D Web轻量化引擎HOOPS Communicator如何打造流畅3D体验?
  • 【AUTOSAR】时间保护(Timing Protection)概念、应用与实现源代码解析(下篇)
  • Docker 挂载卷并保存为容器
  • oracle在线迁移数据文件
  • 【平面波导外腔激光器专题系列】用于光纤传感的低噪声PLC外腔窄线宽激光器
  • 【R语言编程绘图-箱线图】
  • 什么是项目突围管理,如何培养相关能力
  • c++复习(类型准换+动态数组+类与对象)
  • 三十、面向对象底层逻辑-SpringMVC九大组件之HandlerInterceptor接口设计
  • 大模型的开发应用(四):深度学习模型量化与QLoRA微调
  • WPF【11_3】WPF实战-重构与美化(可复用的UI组件)
  • 编写第一个ros程序
  • 【Python训练营打卡】day37 @浙大疏锦行
  • 吉林省CCPC与全国邀请赛(东北地区赛)游记
  • 把 CURSOR 的工具活动栏改成和 VSCODE 一样的左侧展示
  • 防爆手机VS普通手机,区别在哪里?
  • Python实例题:使用Python定制词云
  • 基于深度学习的语音识别系统设计与实现
  • OpenCV CUDA模块图像处理------颜色空间处理之用于执行伽马校正(Gamma Correction)函数gammaCorrection()
  • Jenkins分配对应项目权限与用户管理
  • Linux中的常用命令
  • JSON全面解析
  • Qt基础终结篇:从文件操作到多线程异步UI,深度解析核心要点
  • -资产收集篇FridaHOOKXposed证书提取单向双向检验抓包
  • Logi鼠标切换桌面失效
  • ubuntu2x.xx网络不通如何解决
  • 《计算机组成原理》第 9 章 - 控制单元的功能
  • 光电赋能低空场景,灵途科技助力无人机持续升级
  • 红黑树,B树,二叉树之间的不同
  • 【监控】Prometheus中的告警机制介绍