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

力扣经典算法篇-47-Pow(x, n)(快速幂思路)

1、题干

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

2、解题

本题求解x的n次幂,简单来说就是n个x相乘,但作为算法考察的目题目,肯定不会那么简答,下面通过快速幂的方法优化一下。

快速幂思路:
对于起始入参x,将前一次的计算的结果作为下一步的计算入参。这样可以在O(logn)的时间复杂度上得到优化。但是要注意n是奇偶数的情况。
在这里插入图片描述
如:2的64次方求解。
传统做法:22222222=256。需要计算7次乘法操作。
快速幂做法:先2
2=4,在44=16,在1616=256。只需要计算3次乘法即可。

方法一:(快速幂 + 递归)

快速幂的求法,实际也是分治的思路。
注意:
求解快速幂,如果n%20,直接拿二分的结果相乘即可。如果n%21,二分的结果相乘后还要在乘以一次x。
如:4/2=2; 是2的4次幂可以直接使用2的2次幂结果相乘;但5/2=2; 这种情况就需要再乘以一次x才能得到正确结果。

代码示例:

public class Test54 {public static double myPow(double x, int n) {if (n == 0 || x == 1) {   // x为1或n==0可以快速返回1return 1;}double result = quickMul(x, n);   // 对求解return n > 0 ? result : 1 / result;     // 注意指数为负数要返回倒数}private static double quickMul(double x, int n) {if (n == 0) {     // 递归终止条件,n==0不可再分,因为相乘需要返回1,如果是相加一般返回0return 1;}double halfTemp = quickMul(x, n / 2);      // 求取一半指数时的答案,思路类似二分法return n % 2 == 0 ? halfTemp * halfTemp : halfTemp * halfTemp * x;    // 注意偶数直接相乘即可,基数还需要乘以x一次。}public static void main(String[] args) {double x = 2.00000;int n = 10;System.out.println(myPow(x, n));}
}

向阳前行,Dare To Be!!!

http://www.dtcms.com/a/324524.html

相关文章:

  • 每日算法刷题Day60:8.10:leetcode 队列5道题,用时2h
  • Java Stream流详解:从基础语法到实战应用
  • 安装1panel之后如何通过nginx代理访问
  • Linux系统编程Day11 -- 进程属性和常见进程
  • 智慧社区(十一)——Spring Boot 实现 Excel 导出、上传与数据导入全流程详解
  • Langchain调用MCP服务和工具
  • MySQL的逻辑架构和SQL执行的流程:
  • 正确使用SQL Server中的Hint(10)—Hint简介与Hint分类及语法(1)
  • Spring Boot + SSH 客户端:在浏览器中执行远程命令
  • 深入理解 Java 中的线程池:原理、参数与最佳实践
  • 【密码学】8. 密码协议
  • 金融机构在元宇宙中的业务开展与创新路径
  • 【教学类-29-06】20250809灰色门牌号-黏贴版(6层*5间层2间)题目和答案(剪贴卡片)
  • 使用Python调用OpenAI的function calling源码
  • Pytorch深度学习框架实战教程-番外篇02-Pytorch池化层概念定义、工作原理和作用
  • ROS2 QT 多线程功能包设计
  • PHP项目运行
  • (LeetCode 每日一题) 869. 重新排序得到 2 的幂 (哈希表+枚举)
  • Framework开发之Zygote进程2(基于开源的AOSP15)--init.rc在start zygote之后的事情(详细完整版逐行代码走读)
  • springboot骚操作
  • 【论文阅读】Deep Adversarial Multi-view Clustering Network
  • 视觉障碍物后处理
  • Java开发异步编程中常用的接口和类
  • 人工智能之数学基础:如何理解n个事件的独立?
  • [C/C++线程安全]_[中级]_[避免使用的C线程不安全函数]
  • Android APK 使用OpenGl 绘制三角形源码
  • Word XML 批注范围克隆处理器
  • 绕过文件上传漏洞并利用文件包含漏洞获取系统信息的技术分析
  • 使用MongoDB存储和计算距离
  • Spring Boot 2 升级 Spring Boot 3 的全方位深度指南