题目
中等
实现 pow(x, n) ,即计算 x
的整数 n
次幂函数(即,xn
)。
示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
n
是一个整数- 要么
x
不为零,要么n > 0
。-104 <= xn <= 104
思路和解题方法
- 定义了一个名为
myPow
的函数,它接受两个参数:底数x
和指数n
。- 将指数
n
转换为long long
类型的变量N
,以处理负数指数的情况。- 如果指数
N
大于等于零,则调用递归函数fun(x, N)
来计算结果;否则,计算1.0
除以递归函数fun(x, -N)
的结果,以处理负数指数的情况。- 定义了一个名为
fun
的递归函数,它接受两个参数:底数x
和指数n
。- 如果指数
n
等于零,则返回1
作为递归终止条件。- 如果指数
n
等于1
,则返回底数x
作为递归终止条件。- 否则,计算一半指数的递归结果
t = fun(x, n / 2)
。- 如果指数
n
为偶数(即n % 2 == 0
),则返回t
的平方y * y
作为结果。- 如果指数
n
为奇数,则返回t
的平方乘以底数x
的结果y * y * x
作为结果。
复杂度
时间复杂度:
O(log n)
时间复杂度为O(logN),其中N是指数的绝对值。这是因为在每个递归步骤中,指数被除以2,因此需要logN步才能将指数减少到0或1。而在每个递归步骤中,只需要进行一次乘法运算,所以总的计算复杂度是O(logN)。
空间复杂度
O(log n)
空间复杂度为O(logN),这是由于在每个递归步骤中,需要使用栈空间来保存递归调用的上下文,因此递归深度最多为logN,从而占用O(logN)的空间。
c++ 代码
class Solution {
public:
double myPow(double x, int n) {
long long N=n; // 将指数 n 转换为 long long 类型的变量 N,以处理负数指数的情况
return N>=0?fun(x,N):1.0/fun(x,-N); // 如果指数 N 大于等于零,则调用 fun(x, N) 计算结果;否则,计算 1.0 除以 fun(x, -N) 的结果
}
double fun(double x, int n) {
if (n == 0) return 1; // 指数为 0,返回 1 作为递归终止条件
if (n == 1) return x; // 指数为 1,返回底数 x 作为递归终止条件
double y = fun(x, n / 2); // 递归计算一半指数的结果 y
// 如果指数为偶数,则返回 y 的平方;如果指数为奇数,则返回 y 的平方乘以底数 x
return n % 2 == 0 ? y * y : y * y * x;
}
};
总结收获
快速幂是一种高效计算幂函数的方法,它利用了指数的二进制表示形式。递归在这里用于将问题拆分成更小的子问题。
首先解释一下快速幂的思想:假设要计算 x 的 n 次幂,可以通过以下步骤进行计算:
- 初始化结果 res 为 1。
- 将指数 n 转换为二进制表示形式,例如将 11 转换为二进制为 1011。
- 从二进制的最右边开始,依次遍历每一位:
- 如果当前位为 1,则将结果 res 乘以底数 x。
- 将底数 x 自乘,即 x = x * x,表示底数每次自乘一次。
- 继续遍历下一位,直到遍历完成(即指数的所有位都处理完毕)。
- 返回最终的结果 res。
而递归在快速幂算法中的作用是将问题不断拆分成更小的子问题。在代码中,
fun
函数用递归的方式计算幂函数。
- 首先判断递归的终止条件:
- 如果指数
n
等于 0,说明任何数的 0 次幂都等于 1,所以返回 1。- 如果指数
n
等于 1,说明任何数的 1 次幂都等于它本身,所以返回底数x
。- 如果指数
n
大于 1,通过递归调用fun
函数计算底数x
的一半指数的结果y = fun(x, n / 2)
。这里通过将指数除以 2,将问题的规模减小一半。- 然后根据指数的奇偶性进行判断:
- 如果指数
n
是偶数,即n % 2 == 0
,则返回y
的平方y * y
,因为x^n = (x^(n/2))^2
。- 如果指数
n
是奇数,则返回y
的平方乘以底数x
的结果y * y * x
,因为x^n = (x^(n/2))^2 * x
。- 最终递归结束时会得到结果。
通过递归和快速幂的思想,可以将幂函数的计算复杂度从线性降低到对数级别,提高计算效率。
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。