递归专题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..下期要讲解的内容是

计算布尔二叉树的值

下期见。

相关推荐
fpcc1 分钟前
数据结构和算法—最短路径的算法
数据结构·算法
迪丽热爱3 分钟前
多媒体应用17-831(补)
学习
tju新生代魔迷16 分钟前
Verilog HDL学习笔记(五)| 第5章 门级建模(上)——基本门原语与门延迟
笔记·学习
茉莉玫瑰花茶18 分钟前
RAG 数据检索
人工智能·算法·机器学习
重生之小比特24 分钟前
【初阶C++】string
开发语言·c++
老当益壮梁奶奶25 分钟前
Linux软件编程学习笔记(十一):深入浅出 TCP 协议与 Socket 编程实践
linux·c语言·笔记·学习·tcp/ip
Dream Cosmos26 分钟前
C++继承详解(上):继承规则、父子类转换与作用域隐藏
c++
skr爱码士27 分钟前
15_国际化和本地化:tr()、ts 文件、QM 文件、多语言切换
c++·qt·ui·客户端
清钟沁桐32 分钟前
mlir 编译器学习笔记之十四 -- cpu算子自动生成
笔记·学习·mlir
speop36 分钟前
hell-gpu| TASK01-2
linux·运维·算法