LeetCode50.Pow(x, n)

devtools/2024/10/15 17:17:17/

题目要求

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

破题思路

快速幂算法

求x的n次方最简单的方法是写一个n次的循环,每一次循环乘以一个x,那这样的话时间复杂度就是n。

快速幂法可以将时间复杂度下降到logn。

以下将从二进制和二分法两个角度进行解析

二进制角度

利用十进制数字 n 的二进制表示,可对快速幂进行数学化解释。

 对于十进制整数n,可以化为二进制bm...b3b2b1;

则有二进制转十进制,(二进制转十进制的公式)

那么对于x的n次方,则有

,展开就是

所以根据以上推导,可以把求x的n次方转化成求上面那条公式的积。

所以,我们现在就要做的是两件事:

  1. 求出x²,x4,x的2m-1次方的值
  2. 求出b1,b2,b3的值。

所以在循环中,我们要求x的2的n次幂的话,就执行x = x²就行。

取bi的话,循环执行以下操作即可。

  1. n&1 (与操作): 判断 n 二进制最右一位是否为 1 ;
  2. n>>1 (移位操作): n 右移一位(可理解为删除最后一位)。

b的值只有两种情况,0和1,如果是1的话那就是x的2的某一个次方,0的话那就是1,用公式表示是这样的。

举个小例子。

 

分治法角度

快速幂实际上是分治思想的一种应用。

令 n/2 为整数,则需要分为奇偶两种情况(设向下取整除法符号为 "//" ):

观察发现,当 n 为奇数时,二分后会多出一项 x 。

幂结果获取

  • 根据推导,可通过循环 x=x2 操作,每次把幂从 n 降至 n//2 ,直至将幂降为 0 ;
  • 设 res=1 ,则初始状态 xn=xn×res 。在循环二分时,每当 n 为奇数时,将多出的一项 x 乘入 res ,则最终可化至 xn=x0×res=res,返回 res 即可。

转化为位运算则是

  • 取余数 n%2 等价于 判断二进制最右位 n&1 ;
  • 向下整除 n//2 等价于 右移一位 n>>1 ;

算法流程

  1. 当 x=0.0 时:直接返回 0.0 ,以避免后续 1 除以 0 操作报错。分析: 数字 0 的正数次幂恒为 0 ; 0 的 0 次幂和负数次幂没有意义,因此直接返回 0.0 即可。

  2. 初始化 res=1 。
  3. 当 n<0 时:把问题转化至 n≥0 的范围内,即执行 x=1/x ,n=−n 。
  4. 循环计算:当 n=0 时跳出。
  • 当 n&1=1 时:将当前 x 乘入 res (即 res∗=x )。
  • 执行 x=x2 (即 x∗=x )。(给下一项)
  • 执行 n 右移一位(即 n>>=1)。

5.返回res

class Solution {public double myPow(double x, int n) {if(x == 0.0f){return 0.0d;}long b = n;double res = 1.0d;//如果n<0,则按照幂小于0的方式来进行计算if(b < 0){x = 1 / x;b = -b;}while(b > 0){//首先处理n的低位if((b & 1) == 1){//如果低位为1,则进行计算//如果低位为0,那么结果是1,什么数的0次方都是1,可忽略res = res * x;}//下一项的x底数是上一项的平方x = x * x;//n右移一位b >>= 1;}return res;}
}

 手写流程


http://www.ppmy.cn/devtools/126259.html

相关文章

门店收银系统源码-php+flutter+uniapp

1. 系统开发语言 核心开发语言: PHP、HTML5、Dart 后台接口: PHP7.3 后台管理网站: HTML5vue2.0element-uicssjs 线下收银台&#xff08;安卓/PC收银、安卓自助收银&#xff09;: Dart3 框架&#xff1a;Flutter 3.19.6 移动店务助手: uniapp 线上商城: uniapp 2.线下收…

鸿蒙Swiper动态加载翻页数据(等同于安卓动态加载viewPager)

我这里是加载一个实体类列表 类似 List 的数据&#xff0c;那么首先写一个dataSource&#xff1a; export class MyDataSource implements IDataSource {private list: MyBean[] []constructor(list: MyBean[]) {this.list list}totalCount(): number {return this.list.len…

用SQLyog连接mysql提示2058错误

1)在cmd下(必须是这个,不能是gitbash) // step1:修改下数据库 C:\Users\elex>mysql -uroot -p Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 97 Server version: 8.1.0 MySQL Community Server - GPLCopy…

javaweb实现下载功能报错sockettimeout

javaweb 压缩zip包下载&#xff0c;并响应头里面指定文件大小 在Java Web应用程序中&#xff0c;如果你想要创建一个ZIP文件并通过HTTP响应提供下载&#xff0c;并且希望在响应头中指定文件大小&#xff0c;你可以先将文件写入到一个临时的ByteArrayOutputStream中&#xff0c;…

Vue实现动态表单

使用 Vue 实现动态表单 在前端开发中&#xff0c;我们经常遇到根据用户输入动态生成不同表单项的需求。这类动态表单不仅提升了用户体验&#xff0c;还可以让复杂的交互流程变得简洁而高效。本文将详细讲解如何使用 Vue 3 的响应式特性&#xff0c;逐步构建一个递归动态表单。…

13.java面向对象:面向对象的三大特征

面向对象的三大特征 封装 我们程序设计要追求“高内聚&#xff0c;低耦合”。高内聚就是类的内部数据操作细节自己完成&#xff0c;不允许外部干涉&#xff1b;低耦合&#xff1a;仅暴露少量的方法给外部使用。 封装(数据的隐藏&#xff09;通常应禁止直接访问一个对象中数据…

PHP 中浮点数 array_sum 求和精度丢失问题

首先给定一个数组&#xff1a; // 该数组中&#xff0c;amount 为 float/double 或 string 不影响结果 $arr [[amount > 1493.66],[amount > 1493.66],[amount > 1493.66] ];求和&#xff1a; $amount array_sum(array_column($arr, amount));我们已知晓的结果如下…

Vert.x,Web - 静态资源/模板

静态资源 Vert.x-Web带有开箱即用的处理器(StaticHandler)&#xff0c;用于处理静态Web资源(.html, .css, .js, …)&#xff0c; 因此可以非常轻松地编写静态Web服务器。 默认静态文件目录为类路径下的webroot目录&#xff0c;对于maven的项目&#xff0c;按规范放在src/main/…