剑指 Offer 16. 数值的整数次方

news2024/12/25 2:33:48

题目

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
在这里插入图片描述

思路

快速幂算法

x^n最简单的方法是通过循环将 nx 乘起来,依次求 x1,x2,...,x^n,时间复杂度为 O(n)。 快速幂法 可将时间复杂度降低至 O(logn) ,当指数 n为负数时,可以计算 x^-n
再取倒数得到结果,因只需要考虑 n 为自然数的情况。

快速幂 + 递归

快速幂算法 的本质是分治算法

举个例子,如果要计算 x ^ 64 ,可以按照:
在这里插入图片描述
的顺序,从 x开始,每次直接把上一次的结果进行平方,计算 6 次就可以得到 x^64的值,而不需要对 x63x

再举一个例子,如果要计算 x^77 ,可以按照:
在这里插入图片描述
的顺序,可以看到有的步骤是直接平方得来的,有的步骤在平方后还需要乘一个x,如x^4 → x^9

直接从左到右进行推导很难看出来,在将上一次的结果平方之后,还需不需要额外乘 x

但如果从右往左看,并采用分治的思想:

  • 当要计算 x^n时,可以先递归地计算出 y=x^⌊n/2⌋,其中 ⌊a⌋表示对 a 进行下取整;
  • 根据递归计算的结果,如果 n 为偶数,那么 x^n = y^2;如果 n 为奇数,那么 x^n = y^2 * x
  • 递归的边界为 n=0,任意数的 0 次方均为 1

由于每次递归都会使得指数减少一半,因此递归的层数为 O(log⁡n)

java代码如下:

class Solution{
	public double myPow(double x, int n){
		//将n用long表示,因为正值和负值的取值范围不是对称的,INT_MIN = -INT_MAX - 1,假如n是INT_MIN,那么-n==INT_MAX + 1, 超出了INT_MAX的表示范围了。
		long N = n;
		//如果N为正数,直接计算,如果N为负数,则计算x^-n的倒数
		return N >= 0 ? quickMul(x,N) : 1.0 / quickMul(x,-N);
	}
	
	public double quickMul(double x, long N){
		if(N == 0){
			return 1.0;
		}
		double y = quickMul(x, N / 2);
		//如果N偶数,直接x^n == y ^ 2,如果N是奇数,则多乘一个x
		return N % 2 == 0 ? y * y : y * y * x;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/128201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【微服务】Nacos 注册中心服务数据模型

目录 一、前言 二、服务(Service)和服务实例(Instance) 1、定义服务 2、服务元数据 3、定义实例 4、实例元数据 5、持久化属性 三、集群 1、定义集群 四、生命周期 1、服务的⽣命周期 2、实例的⽣命周期 3、集群的⽣命…

使用Comsol完成固体火箭装药的燃面推移

简介 为了计算固体火箭发动机的内弹道曲线,必须知道燃面面积随烧去肉厚的变化关系。目前主要有实体造型法、动网格法、水平集法等。笔者给出一种直接使用Comsol有限元软件完成燃面推移的方法,使用简便快捷,无需编写代码。 理论部分可参考论…

API风险

©网络研究院 从表面上看,API帮助企业连接应用程序并相互共享数据。这为客户和用户创造了更简单、更无缝的体验。 如果你曾经使用你的谷歌账户登录过多个网站或应用程序,那么你很有可能使用的是谷歌开发的API。 像这样的API在后台工作&#xff0c…

极狐gitlab-runner的安装

1)下载系统对应的二进制文件 # Linux x86-64 sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 2)赋予执行权限 chmod x /usr/local/bin/gitlab-runne…

Faster RCNN网络源码解读(Ⅱ) --- Faster RCNN源码使用

目录 一、源码链接 二、环境配置 三、文件结构 四、预训练权重下载地址 五、训练集 六、训练方法及注意事项 七、大概看一下训练过程(train_mobilenetv2.py) 一、源码链接 Faster R-CNN源码链接https://pan.baidu.com/s/1SQjyLXD47H11ke05OXY…

基于javaweb的学院社团管理系统(idea+servlet+jsp)

一、系统简介 本项目采用idea工具开发,jspservletjquery技术编写,数据库采用的是mysql,navicat开发工具。 系统一共分为3个角色分别是:管理员,学生,社长 获取方式:基于javaweb的学院社团管理系…

VisualStudio2015安装不上的解决方法_选择对应msi_依然报错继续选择---VisualStudio2015工作笔记001

这个visualstudio网上竟然有卖的,真的是太~咱啥也不说了~ 好了说解决办法吧; 1.这里完整版大小挺大的6G多,但是这里我们找的有可能是只有3.8G左右的,这个版本的就是有文件损坏...但是这个版本是可以装上的,也不耽误用的,我亲自测试了. 2.因为很久没写vb.net程序了,想写个小程…

Docker中安装宝塔

1、docker拉取ubuntu系统 docker pull ubuntudocker pull ubuntu 2、运行容器 docker run -i -t -d --name bt -p 2000:20 -p 2100:21 -p 8000:80 -p 4430:443 -p 8880:888 -p 8888:8888 --privilegedtrue -v /d/baota:/www/wwwroot ubuntu -v后的/d/baota代表本地D盘的bao…

【LeetCode】二叉树中的最大路径和 [H](递归)

124. 二叉树中的最大路径和 - 力扣(LeetCode) 一、题目 路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一…

擎创技术流 | ClickHouse实用工具—ckman教程(8)

2022年即将迎来终点,各大公司和网站开始出“年终使用报告”了,而关于ClickHouse系列分享也来到了尾期。本系列最初一共规划了10期内容,一转眼就只剩最后2期了,初衷就是单纯的技术分享,如果你能从中得到启发&#xff0c…

圣诞节来临,TikTok上圣诞相关产品销量突破5万单丨超店有数

12月25日,圣诞节正式来临。TikTok卖家和达人如何把握住这个一年一度的「西方春节」,如何实现精准选品,快速爆单。凡事预则立,不预则废。快人一步,掌握趋势,抢占先机。 从谷歌趋势观察,一周内「…

图说Netty服务端启动过程

我们知道Netty是一个基于JDK的nio实现的网络编程框架,那Netty的服务端是怎么启动的呢,包括他是何时register 的,何时 bind 端口的,以及何时开始读取网络中的数据的? 让我们带着这个疑问,通过一个官方的例子…

webRTC 实现人脸识别

首先我们需要先了解一下什么是webRTC 他能做什么 webRTC主要是帮我们处理多媒体应用,如音视频通话,屏幕共享都可以实现,主要基于浏览器API调用,其底层浏览器会调用native C 等一些库帮我们实现的,而我们在应用层掉API …

欧科云链荣获人民网匠心技术奖,科技创新共造企业发展“强引擎”

什么是匠心精神? 是简单的事情重复做 重复的事情用心做 是对自己热爱的事物 不断坚持、不断钻研的精神 昨日,由人民网主办的“2022人民财经高峰论坛”成功举办,论坛还公布了“第十九届人民匠心奖”获奖名单。欧科云链携旗下“链上天眼”产品荣…

第三十七章 数论——博弈论

第三十七章 数论——博弈论一、Nim游戏1、题目2、结论3、结论验证4、代码二、台阶——Nim游戏1、问题2、思路2、代码三、集合——Nim游戏1、问题2、思路—SG()函数2、代码实现(记忆化搜索)一、Nim游戏 1、题目 2、结论 这里直接说结论: 假设…

vue导入私有组件和注册全局组件

目录先下载并配置插件导入私有组件注册全局组件先下载并配置插件 导入的时候需要路径,有个符号,但不能提示路径,需要手打路径,会发现很麻烦,这时候可以通过vscode插件来解决 vscode搜索Path Autocomplete 配置插件,点击插件设置—扩展设置,点开任意一个setting.json中编辑,打开…

Yield Guild Games 和 Axie Infinity:迄今为止的旅程

2022 年,菲律宾被认为是全球应用 web3 的中心,在 Chainalysis 的全球加密货币应用指数中排名第二,在拥有最多 MetaMask 用户的国家中排名第三。虽然该国作为 Coins.ph 和 BloomX 等开创性数字资产交易所以及对加密货币友好的 UnionBank 的所在…

Flutter生命周期

一、组件生命周期 flutter组件只有两种:有状态和无状态组件。由于无状态组件效率高,如果不涉及到组件内部的数据存储,尽量多的使用无状态组件 1、StatelessWidget build:组件渲染 调用次数:1次 StatelessWidget是无状…

MYSQL索引和sql优化

基本 索引是帮助数据高效查询的有序数据结构,没有索引进行查询就会进行全表扫描myisam中的.MYI和innodb中的.idb都是存放索引的文件。索引提高查询效率的同时,也降低了更新表的数据,因为数据库中删改查会维护索引的结构。一般提到的索引就是…

安装mysqlclient失败解决办法

简介 系统:MAC 前因:django使用mysql数据库报错django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.Django使用MySQL数据库需要加载 MySQLdb模块,需要安装 mysqlclient(django2.2以前安装pymysql&#…