LeetCode 50. Pow(x, n)(快速幂详解 | C语言实现)

一、题目描述

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数。

复制代码
double myPow(double x, int n);

示例:

复制代码
示例 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/2^2 = 1/4 = 0.25

提示:

复制代码
-100.0 < x < 100.0
-2^31 <= n <= 2^31 - 1

二、解题思路

如果直接循环计算:

复制代码
x * x * x * x ... (n次)

时间复杂度是:

复制代码
O(n)

n 很大时效率会非常低。

因此需要使用 快速幂(Binary Exponentiation)

核心思想:

复制代码
x^10
10 的二进制 = 1010

x^10 = x^8 * x^2

计算时不断:

复制代码
底数平方
指数除2

例如:

复制代码
x^10

10 = 1010

x^10
= x^8 * x^2

通过二进制拆分,可以把复杂度降到:

复制代码
O(log n)

三、注意的坑

1 指数可能为负数

例如:

复制代码
x^-2 = 1 / x^2

因此需要先处理:

复制代码
if(n < 0)
{
    x = 1/x;
    n = -n;
}

2 INT_MIN 溢出问题

当:

复制代码
n = -2147483648

执行:

复制代码
-n

会溢出。

解决方法:

复制代码
使用 long long

四、方法一:快速幂(迭代实现)

算法步骤

循环过程中:

复制代码
如果当前二进制位为1 -> 乘入结果
底数平方
指数右移

例如:

复制代码
n = 10
二进制:1010

计算过程:

n result x
10 1 2
5 1 4
2 4 16
1 4 256
0 1024 65536

C语言代码

复制代码
double myPow(double x, int n) 
{
    long long N = n;

    if(N < 0)
    {
        x = 1 / x;
        N = -N;
    }

    double result = 1.0;

    while(N > 0)
    {
        if(N & 1)
        {
            result *= x;
        }

        x *= x;
        N >>= 1;
    }

    return result;
}

五、方法二:递归快速幂

利用递归思想:

复制代码
x^n = (x^(n/2))^2

如果 n 为奇数:

复制代码
x^n = (x^(n/2))^2 * x

C语言实现

复制代码
double fastPow(double x, long long n)
{
    if(n == 0)
        return 1;

    double half = fastPow(x, n / 2);

    if(n % 2 == 0)
        return half * half;
    else
        return half * half * x;
}

double myPow(double x, int n)
{
    long long N = n;

    if(N < 0)
        return 1 / fastPow(x, -N);

    return fastPow(x, N);
}

六、复杂度分析

时间复杂度:

复制代码
O(log n)

因为每次指数都:

复制代码
n / 2

空间复杂度:

复制代码
迭代:O(1)
递归:O(log n)

七、总结

本题核心是 快速幂算法,关键点有三个:

1️⃣ 指数转二进制计算

2️⃣ 处理负指数

3️⃣ 防止 INT_MIN 溢出

快速幂在很多题目中都会出现,例如:

复制代码
50. Pow(x,n)
191. 位1的个数
190. 颠倒二进制位
231. 2的幂
342. 4的幂

算法面试高频技巧之一


相关推荐
皙然1 小时前
彻底吃透红黑树
数据结构·算法
t198751282 小时前
TOA定位算法MATLAB实现(二维三维场景)
开发语言·算法·matlab
jllllyuz2 小时前
粒子群算法解决资源分配问题的MATLAB实现
开发语言·算法·matlab
renhongxia12 小时前
从模仿到创造:具身智能的技能演化路径
人工智能·深度学习·神经网络·算法·机器学习·知识图谱
qq_401700413 小时前
顺序、二分、插值、斐波那契查找算法
数据结构·算法·排序算法
x_xbx3 小时前
LeetCode:26. 删除有序数组中的重复项
数据结构·算法·leetcode
WitsMakeMen3 小时前
RoPE 算法原理?算法为什么只和相对位置有关
人工智能·算法·llm
0 0 03 小时前
CCF-CSP 38-4 月票发行【C++】考点:动态规划DP+矩阵快速幂
c++·算法·动态规划·矩阵快速幂
北漂Zachary3 小时前
Mysql中使用sql语句生成雪花算法Id
sql·mysql·算法