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

leetcode50. Pow(x, n),快速幂算法

leetcode50. Pow(x, n),快速幂算法

实现 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

目录

  • leetcode50. Pow(x, n),快速幂算法
    • 总体思维导图
  • 快速幂算法详解
    • 算法背景
    • 算法原理
    • 算法步骤
    • 算法优势
    • 应用场景
    • 流程图
    • 具体代码
    • 算法分析
    • 相似题目

总体思维导图

在这里插入图片描述

快速幂算法详解

算法背景

快速幂算法是一种高效计算 x n x^n xn 的方法,特别适用于 n n n 非常大的情况。它基于幂的性质和二进制表示。

算法原理

  1. 二进制表示:任何整数 n n n 都可以用二进制表示。例如, 13 13 13 的二进制表示是 1101 1101 1101
  2. 幂的性质 x n x^n xn 可以分解为 x 2 0 × x 2 1 × x 2 2 × … x^{2^0} \times x^{2^1} \times x^{2^2} \times \ldots x20×x21×x22× 的形式。例如, x 13 x^{13} x13 可以分解为 x 1 × x 4 × x 8 x^{1} \times x^{4} \times x^{8} x1×x4×x8
  3. 位操作:通过检查 n n n 的二进制表示中的每一位,我们可以确定是否需要将对应的 x 2 k x^{2^k} x2k 乘入结果中。

算法步骤

  1. 初始化

    • 设置结果 res 为 1。
    • 将指数 n n n 转换为长整型 nn 以避免在负数时的整数溢出。
  2. 特殊情况处理

    • 如果 x = 1 x = 1 x=1,直接返回 x x x
    • 如果 x = − 1 x = -1 x=1,根据 n n n 的奇偶性返回 x x x − x -x x
    • 如果 n < 0 n < 0 n<0,将 n n nn nn 设为正数,并将 x x x 设为其倒数。
  3. 快速幂计算

    • 使用 while 循环,当 n n > 0 nn > 0 nn>0 时执行。
    • 如果 n n nn nn 的当前最低位为 1(nn & 1),则将 r e s res res 乘以 x x x
    • n n nn nn 右移一位(nn >>= 1),即除以 2。
    • x x x 平方(x = x * x)。
  4. 返回结果

    • n n nn nn 变为 0 时,返回 res

算法优势

  • 时间复杂度降低:传统的幂运算需要 O ( n ) O(n) O(n) 的时间复杂度,而快速幂算法只需要 O ( log ⁡ n ) O(\log n) O(logn)
  • 减少乘法操作:通过跳过不必要的乘法,算法减少了计算量。

应用场景

快速幂算法常用于需要高效率幂运算的场合,例如密码学、大数运算等。

这个算法的关键在于利用了二进制的性质和位操作,从而将一个复杂的幂运算问题转化为一系列更简单的乘法和位移操作。

流程图

开始
特殊情况处理
底数x是否为1
返回1
底数x是否为-1
根据n的奇偶性返回结果
指数n是否小于0
取反n, 取倒数x
初始化res=1
循环处理
检查n是否为奇数
res *= x
n >>= 1
x *= x
n是否大于0
返回res
结束

具体代码

class Solution {
public:double myPow(double x, int n) {double res=1;long long nn=(long long)n;if(x==1.00000){return x;}if(x==-1.00000){if(nn%2==1) return x;else return -x;}if(nn<0) {nn=-nn;x=1/x;}while(nn){if(nn&1) res*=x;nn>>=1;x=x*x;}return res;}
};

算法分析

  • 时间复杂度 O ( log ⁡ n ) O(\log n) O(logn),因为每次循环 n n n 都至少减少一半。
  • 空间复杂度 O ( 1 ) O(1) O(1),只使用了常数空间。
  • 易错点:处理负指数和 x = − 1 x = -1 x=1 的情况时容易出错。
  • 注意点:使用 long long 类型处理大指数,防止整数溢出。

相似题目

下面是一些与快速幂算法相关的题目,您可能会感兴趣:

题目链接
Pow(x, n)LeetCode
Super PowLeetCode
Pow(x, n) IILintCode

这些题目都可以使用快速幂算法来解决。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java 代码详解:删除链表中的倒数第 N 个节点
  • JavaScript 数组迭代
  • WPF篇(5)- Border控件(边框布局)+GridSplitter分割窗口
  • Linux虚拟化技术的演进:Xen与KVM的历程与影响
  • 【Kubernetes】k8s集群之Pod容器资源限制和三种探针
  • 河南萌新联赛2024第(四)场:河南理工大学补题(B,C,I)
  • 软件测试面试题汇总,超详细整理。。。
  • 【https】无法安装OpenSSL时如何在局域网开通https服务
  • 常见8种数据结构
  • 好领导都会用三招管好下属!
  • 三数之和(LeetCode)
  • 全栈监控:一目了然的 IT 管理
  • 第13节课:Web Workers与通信——构建高效且实时的Web应用
  • MySQL笔记-基础篇(一):查询
  • EdgeWorkers 最佳实践丨助力流媒体创新
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 2017 年终总结 —— 在路上
  • CSS 三角实现
  • django开发-定时任务的使用
  • java8 Stream Pipelines 浅析
  • JavaScript 奇技淫巧
  • Java多态
  • Mysql数据库的条件查询语句
  • Mysql优化
  • spark本地环境的搭建到运行第一个spark程序
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring声明式事务管理之一:五大属性分析
  • V4L2视频输入框架概述
  • Webpack 4x 之路 ( 四 )
  • windows下mongoDB的环境配置
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 区块链共识机制优缺点对比都是什么
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 原生Ajax
  • puppet连载22:define用法
  • Spring Batch JSON 支持
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (1)(1.9) MSP (version 4.2)
  • (10)ATF MMU转换表
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (简单) HDU 2612 Find a way,BFS。
  • (利用IDEA+Maven)定制属于自己的jar包
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (四)js前端开发中设计模式之工厂方法模式
  • (四)鸿鹄云架构一服务注册中心
  • (转) ns2/nam与nam实现相关的文件
  • (转)IOS中获取各种文件的目录路径的方法
  • .NET BackgroundWorker
  • .Net Core 生成管理员权限的应用程序
  • .NET gRPC 和RESTful简单对比
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .Net6 Api Swagger配置