递归专题5——快速幂

🔥近津薪荼:个人主页

🎬个人专栏:《c语言基础知识详解》《c++基础知识详解》《Linux操作系统及网络基础知识分享》《近津薪荼的算法日迹》

❄️父母是隔在我们和死亡之间的帘子。

你和死亡好像隔着什么在看,没有什么感受,

你的父母挡在你们中间,

等到你的父母过世了,你才会直面这些东西。

------《百年孤独》


1.上期参考代码

cpp 复制代码
/**
 * 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;
    }
};

2.本期知识点导图

3.本期要讲解的题目是

Pow(x, n)

要点:

  • 快速算出x的n次方
  • 注意防止数据溢出

4.解题:

4.1暴力解法

累乘,循环递归都行,时间复杂度:O(N)

分析过程

我们观察累乘的过程,就拿3的8次幂来举例,暴力解法是累乘8次,需要进行9次运算,不够,我们可以把它拆解成两个3 的四次幂相乘,四次幂再拆成2次幂,2次幂再拆成1次幂,1次幂拆成3与零次幂相乘(考虑n可以等于0)这样我们只需要算4次((lg8/lg2)+1)时间复杂度就变成了O(logN)。

4.2优解:

有上述分析,我们已经有了点思路,我们拿两个例子画个图

我们发现

1.处理过程中会出现两情况:奇数/偶数 次幂,那我们在写递归的时候就需要注意分两种情况讨论

(当然要是想3次幂的话就要讨论3种情况,以此类推,但是2次是最合理的)

2.递归的出口在0次幂

5.总结一下代码逻辑:

最小子问题:求x的n次幂(函数头)

每个子问题需要做什么:求x的n/2次幂,并分情况返回tmp

出口:n==0;

6..下期要讲解的内容是

计算布尔二叉树的值

下期见。

相关推荐
鱼鳞_1 天前
Java学习笔记_Day22
java·笔记·学习
会编程的土豆1 天前
【数据结构与算法】 拓扑排序
数据结构·c++·算法
今天又是充满希望的一天1 天前
C++分布式系统知识
开发语言·c++
zth4130211 天前
SegmentSplay‘s Super STL(v2.2)
开发语言·c++·算法
AI_零食1 天前
Flutter 框架跨平台鸿蒙开发 - 鸿蒙麻将游戏应用
学习·flutter·游戏·华为·交互·harmonyos
数据知道1 天前
claw-code 源码详细分析:Bootstrap Graph——启动阶段图式化之后,排障与扩展为什么会变简单?
前端·算法·ai·bootstrap·claude code·claw code
Kel1 天前
从Prompt到Response:大模型推理端到端核心链路深度拆解
人工智能·算法·架构
Felven1 天前
D. Matryoshkas
算法
17(无规则自律)1 天前
DFS连通域统计:岛屿数量问题及其变形
c++·算法·深度优先
蒸蒸yyyyzwd1 天前
检索系统学习笔记
分布式·学习