当前位置: 首页 > news >正文

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++)

classSolution{public:doublemyPow(doublex,intn){doubleans=1.0;// 初始化结果longlongm=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;// 指数右移一位}returnans;}};

复杂度分析

  • 时间复杂度: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) 的时间复杂度。本题是快速幂的经典应用,掌握后可用于解决许多类似问题(如矩阵快速幂、斐波那契数列等)。

http://www.jsqmd.com/news/482333/

相关文章:

  • Unity平台跳跃游戏开发利器:Platformer Project 技术架构深度解析
  • 金三银四已到,Java就业压力为啥还没缓解?
  • JeecgBoot低代码 AI Skills 实战:自然语言驱动 BPM 流程自动生成
  • OpenClaw-龙虾智能体-新手入门必看,一文搞懂核心定义与应用场景
  • LeetCode-206:从数组反转到链表反转,一篇搞懂反转链表
  • IT界有哪些优秀的高并发解决方案?
  • 二次剩余
  • 手机秒变高清摄像头?这个工具用了就回不去了
  • 「JOI Open 2021」怪兽游戏题解
  • 词向量做句子相似度已经落伍?深度解析词移距离(WMD)为何能成为语义匹配新宠!
  • 三月十二
  • 十万个why:Nacos 服务注册为什么默认是临时实例?
  • MySQL 1045 登录失败,远程登录提示1045(本地登录正常)
  • 提示工程架构师深度钻研AI上下文工程长短期记忆机制设计的核心算法
  • AI 换脸软件 MagicMirror 下载安装教程全攻略:普通电脑也能轻松实现离线 AI 换脸
  • 【实证分析】上市公司债务融资成本数据-含代码(2006-2024年)
  • 线程池里的代码明明报错了,为什么控制台一行异常日志都不打?
  • 《Mastering Atari with Discrete World Models》随记
  • 11 张图总结下,微服务增量拉取
  • STM32入门(10)
  • 打开网站显示图片上传失败?错误怎么办|已解决
  • 校园网线是否可以通过两个路由器进行中转?
  • PHP 网站完整搬家避坑指南(新手必看,杜绝报错、断站)
  • Java 后端实现 token自动续期,这方案有点优雅!
  • AI 批量图片去水印工具 v1.0.0 - 豆包专属去水印
  • 分发:AI的终极护城河
  • LLM可观测性:AI系统缺失的环节
  • 面试官问:订单30分钟未支付,自动取消,该怎么实现?
  • 香河婚介所里的无数次擦肩,终在免费缘分中寻得 IT 人的安稳归宿
  • MySQL 1045 登录失败,账号密码错误处理 常见错误与避坑指南