LeetCode 50. Pow(x, n)

LeetCode 50. Pow(x, n) 快速幂

题目描述

实现 pow(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/2^2 = 1/4 = 0.25

提示:

  • -100.0 < x < 100.0
  • -2^31 <= n <= 2^31-1
  • n 是一个 32 位有符号整数
  • 结果的范围是 [-10^4, 10^4]

解题思路

计算 x^n 最直接的方法是循环相乘,但时间复杂度为 O(n),当 n 很大时会超时。本题考察的是 快速幂算法(又称"二分幂"、"二进制指数运算"),能在 O(log n) 时间内完成计算。

快速幂核心思想

将指数 n 用二进制表示,例如 n = 13 的二进制为 1101,则:

复制代码
x^13 = x^(8+4+1) = x^8 * x^4 * x^1

我们可以通过不断将底数平方,并检查当前指数二进制的最低位是否为 1,来决定是否乘入结果。具体步骤如下:

  1. 初始化结果 ans = 1
  2. 当指数 n 不为 0 时循环:
    • 若当前指数的最低位为 1,则将当前的底数乘入结果。
    • 底数自乘(相当于指数右移一位后,底数变为原来的平方)。
    • 指数右移一位。
  3. 循环结束后返回结果。

负指数处理

当指数为负数时,根据公式 x^(-n) = 1 / (x^n),我们可以先取指数的绝对值,并将底数取倒数,然后按正指数计算。

溢出问题

由于 n 的范围包含 -2^31(即 -2147483648),直接取反 -n 会超出 int 范围导致溢出。因此,我们先将 n 转换为 long long 类型,再进行取反操作。


代码实现(C++)

cpp 复制代码
class Solution {
public:
    double myPow(double x, int n) {
        double ans = 1.0;          // 初始化结果
        long long m = n;            // 使用64位整数,防止 n = INT_MIN 时取反溢出
        if (m < 0) {                 // 处理负指数
            m = -m;                  // 指数取绝对值
            x = 1.0 / x;             // 底数取倒数
        }
        while (m) {                   // 快速幂循环
            if (m & 1) {               // 当前二进制位为1,乘入当前底数
                ans *= x;
            }
            x *= x;                    // 底数平方,对应指数二进制位的权重
            m >>= 1;                    // 指数右移一位
        }
        return ans;
    }
};

复杂度分析

  • 时间复杂度:O(log n)。每次循环指数右移一位,循环次数为指数二进制位数,即 log₂(n)。
  • 空间复杂度:O(1)。仅使用了常数个变量。

示例运行

x = 2.0, n = 10 为例:

  • m = 10(二进制 1010),ans = 1.0
  • 第一轮:m & 1 = 0,不乘;x = 4.0(2²),m = 5101)。
  • 第二轮:m & 1 = 1ans *= 4.0ans = 4.0x = 16.0(4²),m = 210)。
  • 第三轮:m & 1 = 0,不乘;x = 256.0(16²),m = 11)。
  • 第四轮:m & 1 = 1ans *= 256.0ans = 1024.0x = 65536.0m = 0,结束。
  • 返回 1024.0,正确。

注意事项

  1. 必须使用 long long 存储指数,避免 INT_MIN 取反溢出。
  2. 负指数时先取倒数再计算,结果自然正确。
  3. 底数为 0 或指数为 0 时,代码也能正确处理(循环直接跳过,返回初始值 1.0)。

总结

快速幂是处理幂运算的高效算法,其核心在于将指数二进制分解,通过位运算和平方累乘实现 O(log n) 的时间复杂度。本题是快速幂的经典应用,掌握后可用于解决许多类似问题(如矩阵快速幂、斐波那契数列等)。

相关推荐
hahaha60168 分钟前
HLS高层次综合设计技巧--数组
开发语言·嵌入式硬件·算法·fpga开发
不会就选b13 分钟前
算法日常・每日刷题--<贪心>10
算法
南京兴帝文化传媒有限公司17 分钟前
本地生活服务商户GEO优化技术实践:AI大模型收录机制与地图POI权重算法拆解
大数据·人工智能·算法·生活·geo优化实操·csdn运营技巧·ai内容收录
linx2951 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
布莱克6051 小时前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
shehuiyuelaiyuehao2 小时前
算法44,模拟算法,数青蛙
算法·哈希算法·散列表
hanlin032 小时前
刷题笔记:力扣第287题-寻找重复数
笔记·算法·leetcode
kevin_kang2 小时前
第02章 对话时间线与延迟分析
算法
科学实验家2 小时前
最小生成树:Prim,kruskal
数据结构·c++·算法
学习智者2 小时前
《玄》IDE v3.6.3重磅发布:全功能修复与性能飞跃
开发语言·c++·ide·算法·中文语言 玄