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

计算布尔二叉树的值

下期见。

相关推荐
Barkamin3 分钟前
快速排序非递归实现
java·算法·排序算法
gihigo19988 分钟前
距离角度解耦法的MIMO-OFDM雷达波束形成及优化MATLAB实现
开发语言·算法·matlab
WolfGang0073218 分钟前
代码随想录算法训练营 Day12 | 二叉树 part02
算法·深度优先
愚者游世10 分钟前
Qt 基础认知
c++·学习·程序人生·职场和发展·visual studio
2401_8535765014 分钟前
代码自动生成框架
开发语言·c++·算法
youyoulg18 分钟前
监督学习-回归
学习·数据挖掘·回归
逆境不可逃20 分钟前
【从零入门23种设计模式23】行为型之模板模式
java·开发语言·算法·设计模式·职场和发展·模板模式
ZPC821021 分钟前
PPO 在ROS2 中训练与推理
人工智能·算法·机器人
IronMurphy22 分钟前
【算法二十五】105. 从前序与中序遍历序列构造二叉树 236. 二叉树的最近公共祖先
java·数据结构·算法
2401_8535765022 分钟前
C++中的组合模式变体
开发语言·c++·算法