《算法题讲解指南:递归,搜索与回溯算法--递归》--3.反转链表,4.两两交换链表中的节点,5.快速幂

《算法题讲解指南:递归,搜索与回溯算法--递归》--3.反转链表,4.两两交换链表中的节点,5.快速幂

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》

《算法题讲解指南》--优选算法

《算法题讲解指南》--递归、搜索与回溯算法

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

3.反转链表

题目链接:

题目描述:

题目示例:

解法(递归):

算法思路:

C++算法代码:

算法总结及流程解析:

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

题目链接:

题目描述:

题目示例:

解法(递归):

算法思路:

C++算法代码:

算法总结及流程解析:

5.快速幂

题目链接:

题目描述:

题目示例:

解法(递归-快速幂):

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


3.反转链表

题目链接:

206. 反转链表 - 力扣(LeetCode)

题目描述:

题目示例:

解法(递归):

算法思路:

      1.递归函数的含义交给你一个链表的头指针,你帮我逆序之后,返回逆序后的头结点
      2.函数体:先把当前结点之后的链表逆序,逆序完之后,把当前结点添加到逆序后的链表后面即可
      3.递归出口:当前结点为空或者当前只有一个结点的时候不用逆序,直接返回
      注意注意注意:链表的题一定要画图,搞清楚指针的操作

C++算法代码:

/** * 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* reverseList(ListNode* head) { //递归的结束条件:当递归到头节点为空结点或者只要一个结点则返回 if(head == nullptr || head->next == nullptr) { return head; } ListNode* newhead = reverseList(head->next); head->next->next = head; //head->next相当于是反转后的尾结点 head->next = nullptr; return newhead; } };

算法总结及流程解析:

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

题目链接:

24. 两两交换链表中的节点 - 力扣(LeetCode)

题目描述:

题目示例:

解法(递归):

算法思路:

      1.递归函数的含义:交给你一个链表,将这个链表两两交换一下,然后返回交换后的头结点;
      2.函数体:先去处理一下第二个结点往后的链表,然后再把当前的两个结点交换一下连接上后面处理后的链表;
      3.递归出口当前结点为空或者当前只有一个结点的时候,不用交换,直接返回
      注意注意注意:链表的题一定要画图,搞清楚指针的操作!

这道题其实在我们的优选算法中已经讲解过了,只是当时是利用其链表的性质使用循环、迭代(模拟算法)来解决的,感兴趣的可以去看看。

《算法题讲解指南:优选算法-链表》--51.两数相加,52.两两交换链表中的节点-ZEEKLOG博客

但是我相信如果真的理解了用宏观的视角来看待递归,一定会觉得递归比上面的模拟实现简单太多了。

C++算法代码:

/** * 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; newhead->next = head; head->next = tmp; return newhead; } };

算法总结及流程解析:

5.快速幂

题目链接:

50. Pow(x, n) - 力扣(LeetCode)

题目描述:

题目示例:

解法(递归-快速幂):

算法思路:

      1.递归函数的含义求出 x 的 n 次方是多少,然后返回
      2.函数体先求出 x 的 n/2 次方是多少,然后根据 n 的奇偶得出 x 的 n 次方是多少
      3.递归出口:当 n 为 0 的时候,返回 1 即可。

C++算法代码:

class Solution { public: double Pow(double x, long long n) //因为n为负数时可以取到-2^32,当转成-n时则超出int最大值,需要改成long long类型 { if(n == 0) { return 1; } double tmp = myPow(x, n / 2); return n % 2 == 0 ? tmp * tmp : tmp * tmp * x; } double myPow(double x, int n) { double ret = n < 0 ? Pow(x, -(long long)n) : Pow(x, n); if(n < 0) { ret = 1 / ret; } return ret; } };

算法总结及流程解析:

结束语

      到此,3.反转链表,4.两两交换链表中的节点,5.快速幂 这三道算法题就讲解完了。反转链表:通过递归逆序后续链表,再将当前节点接在尾部;两两交换链表节点:递归处理后续链表后交换当前两个节点;快速幂:利用分治思想递归计算x的n次方。希望大家能有所收获!

Read more

WhisperX语音识别工具:为什么它比传统方案更值得选择?

WhisperX语音识别工具:为什么它比传统方案更值得选择? 【免费下载链接】whisperXm-bain/whisperX: 是一个用于实现语音识别和语音合成的 JavaScript 库。适合在需要进行语音识别和语音合成的网页中使用。特点是提供了一种简单、易用的 API,支持多种语音识别和语音合成引擎,并且能够自定义语音识别和语音合成的行为。 项目地址: https://gitcode.com/gh_mirrors/wh/whisperX 在当今数字化时代,语音识别技术正迅速改变着我们处理信息的方式。WhisperX作为基于OpenAI Whisper的增强版本,不仅在识别准确率上有所突破,更在处理效率上实现了质的飞跃。本文将深入探讨这款工具的核心价值及其在实际应用中的独特优势。 为什么需要更智能的语音识别? 传统的语音识别系统往往面临多个挑战:处理速度慢、时间戳精度不足、多说话人识别困难等。WhisperX通过创新的技术架构,有效解决了这些问题,为用户提供了前所未有的语音转写体验。 WhisperX语音识别完整流程:从音频输入到精准时间戳输出 核心功能深度解析 批

By Ne0inhk

医疗NLP突破:使用Llama-Factory微调医学知识问答系统

医疗NLP突破:使用Llama-Factory微调医学知识问答系统 在医疗AI落地的攻坚阶段,一个现实问题反复浮现:为什么通用大语言模型走进医院就“水土不服”?患者问“二甲双胍怎么吃”,它可能回答得头头是道,但一旦追问“肾功能不全时如何调整剂量”,答案往往似是而非,甚至出现严重误导。这种“专业幻觉”背后,暴露的是通用模型与医学严谨性之间的鸿沟。 要让AI真正理解临床语境,不能只靠堆数据,更需要一套能将专业知识“刻入”模型认知结构的工程方法。而今天,随着高效微调技术的成熟和开源工具链的完善,我们终于看到了破局的可能——用Llama-Factory这样的框架,在有限资源下完成医学大模型的精准定制。 这不再只是算法团队的专利,而是每个具备基础IT能力的医疗机构都能参与的实践。 Llama-Factory 的价值,恰恰在于它把复杂的模型训练过程从“科研实验”变成了“可复现的工程流程”。它不是一个简单的训练脚本集合,而是一个面向垂直领域的一站式平台,尤其适合像医疗这样术语密集、容错率极低的场景。 想象这样一个画面:一家三甲医院的信息科工程师,在没有AI背景的情况下,仅用两天时间就完成了

By Ne0inhk
【Coze-AI智能体平台】解锁 Coze 工作流:逻辑控制・数据处理・AIGC 多媒体全场景实战

【Coze-AI智能体平台】解锁 Coze 工作流:逻辑控制・数据处理・AIGC 多媒体全场景实战

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人方向学习者 ❄️个人专栏:《coze智能体开发平台》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、业务逻辑节点 * 1.1 选择器节点 * 1.2 意图识别节点 * 1.3 循环节点 * 1.4 批处理节点 * 1.5 变量聚合节点 * 1.6 代码节点 * 1.6.1 JSON? * 1.6.2 python异步编程 * 1.7 数据库节点 * 1.7.1 新增数据节点 * 1.7.2

By Ne0inhk
昇腾NPU运行Llama模型全攻略:环境搭建、性能测试、问题解决一网打尽

昇腾NPU运行Llama模型全攻略:环境搭建、性能测试、问题解决一网打尽

背景 最近几年,AI 大模型火得一塌糊涂,特别是像 Llama 这样的开源模型,几乎成了每个技术团队都在讨论的热点。不过,这些"巨无霸"模型虽然能力超强,但对硬件的要求也高得吓人。这时候,华为的昇腾 NPU 就派上用场了。 说实话,昇腾 NPU 在 AI 计算这块确实有两把刷子。它专门为神经网络计算设计,不仅算力强劲,功耗控制得也不错,最关键的是灵活性很好,可以根据不同场景进行裁剪。所以,用它来跑大模型推理,理论上应该是个不错的选择。 为什么偏偏选了 Llama 来测试? 说到 Llama,这玩意儿现在可是开源界的"网红"。Meta 把它完全开源出来,社区生态搞得风生水起,各种优化和适配层出不穷。 其实选择 Llama 做测试,主要有这么几个考虑:

By Ne0inhk