C++快速幂(递归)

简介: C++快速幂(递归)

C++快速幂

📟作者主页:慢热的陕西人

🌴专栏链接:力扣刷题日记

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言


题目描述

LCR 134. Pow(x, n) - 力扣(LeetCode)

解题思路

借用递归的思路实现pow函数:

首先我们来举两个例子:

偶数:

2 16 2^{16}216—>2 8 2 ^ 828 * 2 8 2 ^ 828 | 2 8 2 ^ 828 —>2 4 2 ^ 424 * 2 4 2 ^ 424 | 2 4 2 ^ 424 —>2 2 2 ^ 222 * 2 2 2 ^ 222 | 2 2 2 ^ 222 —> 2 * 2

奇数:

2 21 2 ^{21}221—>2 10 2 ^ {10}210 * 2 10 2^{10}210 * 2 22 | 2 10 2 ^{10}210 —> 2 5 2 ^ {5}25 * 2 5 2 ^ 525 | 2 5 2 ^ 525 —> 2 2 2 ^ 222 * 2 2 2^222 * 2 | 2 2 2 ^ 222 —> 2 22 * 2 22;

从上面的例子我们也可以看出一个共同的子问题:

如果我们要计算x n x ^ nxn 那么我们先计算 x n / 2 x ^ {n / 2}xn/2, 通过这样的方法我们就可以将计算n次方的时间复杂度降到l o g 2 n log _2 ^ nlog2n

那么答题思路就是如上所示。

细节:

当n = − 2 31 -2 ^ {31}231的时候我们将它转成正数会越界,所以我们在转化之前将它转成longlong即可解决;

代码

class Solution {
public:
    double myPow(double x, int n) 
    {
        return n < 0 ? 1.0 / pow(x, -(long long)n) : pow(x, n);
    }
    double pow(double x, long long n)
    {
        if(n == 0) return 1;
        double tmp = pow(x, n / 2);
        return n % 2 == 0 ? tmp * tmp : tmp * tmp * x;
    }
};

复杂度分析

时间复杂度:

采用了快速幂的算法思路我们只需要O(l o g n log^nlogn)的复杂度即可解决问题;

空间复杂度:

每次递归中都声明了一个临时变量tmp,所以空间复杂度是O(l o g n log ^ nlogn);

相关文章
汉诺塔问题(递归)/梵塔问题c++
汉诺塔问题(递归)/梵塔问题c++
【C++】递归,搜索与回溯算法入门介绍和专题一讲解
【C++】递归,搜索与回溯算法入门介绍和专题一讲解
|
6月前
|
设计模式 中间件 程序员
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
342 3
|
5月前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
6月前
|
C++
C++ 递归与面向对象编程基础
C++ 递归是函数自我调用的技术,用于简化复杂问题。以递归求和为例,`sum` 函数通过不断调用自身累加数字直到 `k` 为 0。递归需谨慎,避免无限循环和资源浪费。面向对象编程(OOP)将程序划分为交互对象,具有属性和方法,提升代码复用、维护和扩展性。C++ OOP 基本概念包括类、对象、属性和方法。通过创建类和对象,利用点语法访问成员,实现代码组织。
48 0
|
6月前
|
Java Go Python
Golang每日一练(leetDay0103) 区域和检索1~3
Golang每日一练(leetDay0103) 区域和检索1~3
58 0
Golang每日一练(leetDay0103) 区域和检索1~3
|
6月前
|
Java Go C++
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
58 0
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
|
6月前
|
算法 C++ Java
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
42 0
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
|
11月前
|
存储 C++
二叉搜索树详解以及C++实现二叉搜索树(递归和非递归)
二叉搜索树详解以及C++实现二叉搜索树(递归和非递归)
65 0