Pow(x, n)

优质博文:IT-BLOG-CN
在这里插入图片描述

题目

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

代码

本题的方法被称为「快速幂算法」,有递归和迭代两个版本。这篇题解会从递归版本的开始讲起,再逐步引出迭代的版本。

当指数 n 为负数时,我们可以计算 x−n再取倒数得到结果,因此我们只需要考虑 n 为自然数的情况。

方法一:快速幂 + 递归
「快速幂算法」的本质是分治算法。举个例子,如果我们要计算 x64,我们可以按照:x→x2 →x4 →x8 →x16 →x32 →x64的顺序,从 x 开始,每次直接把上一次的结果进行平方,计算 6 次就可以得到 x64的值,而不需要对 x 乘 63 次 x。

再举一个例子,如果我们要计算 x77 ,我们可以按照:x→x2 →x4 →x9 →x19 →x38 →x77的顺序,在 x→x2,x2 →x4 ,x19 →x38这些步骤中,我们直接把上一次的结果进行平方,而在 x4 →x9 ,x9 →x19 ,x38 →x77这些步骤中,我们把上一次的结果进行平方后,还要额外乘一个 x。

直接从左到右进行推导看上去很困难,因为在每一步中,我们不知道在将上一次的结果平方之后,还需不需要额外乘 x。但如果我们从右往左看,分治的思想就十分明显了:

当我们要计算 xn时,我们可以先递归地计算出 y=x⌊n/2⌋,其中 ⌊a⌋ 表示对 a 进行下取整;

根据递归计算的结果,如果 n 为偶数,那么 xn =y2;如果 n 为奇数,那么 xn =y2 ×x;

递归的边界为 n=0,任意数的 0 次方均为 1。

由于每次递归都会使得指数减少一半,因此递归的层数为 O(logn),算法可以在很快的时间内得到结果。

class Solution {public double myPow(double x, int n) {long N = 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);return N % 2 == 0 ? y * y : y * y * x;}
}

时间复杂度: O(logn),即为递归的层数。
空间复杂度: O(logn),即为递归的层数。这是由于递归的函数调用会使用栈空间。

方法二:快速幂 + 迭代
由于递归需要使用额外的栈空间,我们试着将递归转写为迭代。在方法一中,我们也提到过,从左到右进行推导是不容易的,因为我们不知道是否需要额外乘 x。但我们不妨找一找规律,看看哪些地方额外乘了 x,并且它们对答案产生了什么影响。

我们还是以 x77 作为例子:

x→x2 →x4 → + x9 → + x19 →x38 → + x 77并且把需要额外乘 x 的步骤打上了 + 标记。可以发现:

x38 → + x77中额外乘的 x 在 x77中贡献了 x;

x9→+x 19中额外乘的 x 在之后被平方了 2 次,因此在 x77中贡献了 x22 =x4

x4→ + x9中额外乘的 x 在之后被平方了 3 次,因此在 x77中贡献了 x23=x8

最初的 x 在之后被平方了 6 次,因此在 x77 中贡献了 x26=x64。我们把这些贡献相乘,x×x4×x8×x64恰好等于 x77。而这些贡献的指数部分又是什么呢?它们都是 2 的幂次,这是因为每个额外乘的 x 在之后都会被平方若干次。而这些指数 1,4,8 和 64,恰好就对应了 77 的二进制表示 (1001101)2 中的每个 1!

因此我们借助整数的二进制拆分,就可以得到迭代计算的方法,一般地,如果整数 n 的二进制拆分为

n=2i0+2i1+⋯+2ik

那么xn=x2i0×x2i1×⋯×x2ik这样以来,我们从 x 开始不断地进行平方,得到 x2,x4 ,x8 ,x16,⋯,如果 n 的第 k 个(从右往左,从 0 开始计数)二进制位为 1,那么我们就将对应的贡献 x2k计入答案。

下面的代码给出了详细的注释。

class Solution {public double myPow(double x, int n) {long N = n;return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);}public double quickMul(double x, long N) {double ans = 1.0;// 贡献的初始值为 xdouble x_contribute = x;// 在对 N 进行二进制拆分的同时计算答案while (N > 0) {if (N % 2 == 1) {// 如果 N 二进制表示的最低位为 1,那么需要计入贡献ans *= x_contribute;}// 将贡献不断地平方x_contribute *= x_contribute;// 舍弃 N 二进制表示的最低位,这样我们每次只要判断最低位即可N /= 2;}return ans;}
}

时间复杂度: O(logn),即为对 n 进行二进制拆分的时间复杂度。
空间复杂度: O(1)。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【spring】IDEA 新建一个spring boot 项目

参考新建项目-sprintboot 选择版本、依赖,我选了一堆 maven会重新下载一次么?

系统工程建模MBSE

################################# ############# 片段一 ############## ################################# 下图采用“V”模式显示了集成的基于模型的系统/嵌入式软件开发流程Harmony。左侧描述了自顶向下的设计流程,而右侧显示了自底而上的从单元测试到最终系统验收测试…

vue3 项目中使用git

一.vue项目创建 二.创建本地仓库并和远程仓库进行绑定 在vue3-project-git 项目文件夹下 初始化一个新的Git仓库&#xff0c;可以看到初始化成功之后就会出现一个.git文件&#xff0c;该文件包含所有必要的 Git 配置和版本控制信息。 创建远程仓库: 打开gitee ,点击右上角 ‘…

低代码用户中心:构建高效平台的新时代

一、低代码开发平台概述 低代码开发平台是一种通过图形化界面和预构建组件来简化应用开发的工具。开发者可以通过拖放组件和配置参数的方式&#xff0c;快速创建和修改应用程序&#xff0c;显著降低了编写代码的复杂度和时间成本。这种平台非常适合用来快速构建和部署企业内部…

Sapiens:人类视觉模型的基础

文章目录 摘要1、引言2、相关工作3、方法3.1、Humans-300M 数据集3.2、预训练3.3、二维姿态估计3.4、身体部位分割3.5、深度估计3.6、表面法线估计 4、实验4.1、实现细节4.2、二维姿态估计4.3、身体部位分割4.4、深度估计4.5、表面法线估计4.6、讨论 5、结论 摘要 我们介绍了 …

无线麦克风什么品牌好?麦克风领夹式的哪个牌子最好?麦克风推荐

近年来&#xff0c;无线领夹麦克风成为了网络主播、在线教育老师的新宠。它小巧便携&#xff0c;能够提供清晰的语音录制&#xff0c;完美匹配快节奏的工作与学习需求。但市场上的产品质量参差不齐&#xff0c;一些低价产品不仅音质差&#xff0c;甚至存在电池寿命短、兼容性差…

程序员的数字化工具有哪些?你用了多少?是否吓到你?

一、程序员常用的数字化工具有哪些&#xff1f; 程序员在日常工作中的数字化工具非常多样&#xff0c;涵盖了编码、测试、部署、协作等多个方面。以下是一些常见的工具&#xff1a; 集成开发环境&#xff08;IDE&#xff09;&#xff1a; IntelliJ IDEAEclipseVisual Studio Co…

(9月10日)最新植物大战僵尸杂交版【v2.4.0版本已更新】

植物大战僵尸杂交版下载链接【v2.4.0版本已更新】 新增了多种植物和僵尸&#xff0c;例如“海豌豆”、“豌豆海草”、“海洋星”等&#xff0c;以及新的僵尸类型&#xff0c;如“僵尸坚果巨人”和“僵尸豌豆小鬼”。 引入了新的游戏模式&#xff0c;例如“超级杂交地图”和“乒…

SQL进阶技巧:如何利用SQL解决趣味赛马问题?| 非等值关联匹配问题

目录 0 问题描述 1 数据准备 2 问题分析 方法一:先分后合思想 方法2:非等值关联匹配 3 小结 0 问题描述 有一张赛马记录表,如下所示: create table RacingResults ( trace_id char(3) not null,race_date date not null, race_nbr int not null,win_name char(30) n…

1万3医学考研题库医学题库ACCESS\EXCEL数据库

今天这个题库按知识点分章节模块智能练习&#xff0c;覆盖书本上所有知识点以及考点&#xff0c;在真#题的解析里边也有详细的展示&#xff1b;另外&#xff0c;这份数据库与《4820道西#医综合真题西#医真#题ACCESS数据库》、《4170条中#医综合真#题中医真#题ACCESS\EXCEL数据库…

去除恢复出厂设置中UI文字显示

文章目录 需求场景 一、代码跟踪与分析在线文字搜索RK平台本地源码搜索实际测试验证代码推理 二、实现方案三、延伸知识四、知识总结 需求 需求&#xff1a;去除恢复出厂设置中UI文字显示 场景 Android 相关产品各种方向旋转、强制横竖屏等需求&#xff0c;导致在恢复出厂设…

Bootstrap简介

Bootstrap 一.Bootstrap简介 什么是Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的。 为什么使用Bootstrap? 快速开发&#xff1a;Bootstrap 提供了一套预设的CSS样式和JavaScript组件&#xff0c;如…

JVM系列(七) -对象的内存分配流程

一、摘要 在之前的文章中,我们介绍了类加载的过程、JVM 内存布局和对象的创建过程相关的知识。 本篇综合之前的知识,重点介绍一下对象的内存分配流程。 二、对象的内存分配原则 在之前的 JVM 内存结构布局的文章中,我们介绍到了 Java 堆的内存布局,由 年轻代 (Young Ge…

LLM时代的transformer参数量、计算量、激活值的分析

导读&#xff1a;本文可以看作是对分析transformer模型的参数量、计算量、中间激活、KV cache的详细说明 定性分析 GPU上都存了哪些东西 首先我们来从全局整体的角度看一看&#xff0c;在训练阶段GPU显存上都有哪些内容&#xff1a; Model States&#xff1a;模型训练过程中…

标签的ref属性

标签的ref属性 当我们想要获取一个标签对应的 DOM 元素的时候在 JavaScript 中&#xff0c;我们通过 document.getElementById() 来借助类选择器的写法获取&#xff0c;但是在 Vue 中&#xff0c;我们的 DOM 元素是挂载在同一个网页上的&#xff0c;这些名称难免会重复&#x…

变压器制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

变压器制造5G智能工厂工业物联数字孪生平台&#xff0c;推进制造业数字化转型。作为传统制造业的重要组成部分&#xff0c;变压器制造行业也不例外地踏上了数字化转型的快车道。而变压器制造5G智能工厂物联数字孪生平台的出现&#xff0c;更是为这一进程注入了强大的动力&#…

docker基本介绍

什么是docker docker是一个开源的容器平台&#xff0c;用于开发、交付和部署 运行应用程序 简单来说 也就是docke他允许开发者将自己的操作环境以及依赖关系打包成一个容器&#xff0c;移动到其他机器上可以供其他人使用&#xff0c;还可以打包成镜像&#xff0c;上传到网络&…

基于yolov8的血细胞检测计数系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的血细胞检测与计数系统是一种利用深度学习技术&#xff0c;特别是YOLOv8目标检测算法&#xff0c;实现高效、准确血细胞识别的系统。该系统能够自动识别并计数图像或视频中的血细胞&#xff0c;包括红细胞、白细胞和血小板等&#xff0c;为医疗诊断提…

硬件工程师笔试面试——MOS管

目录 8、MOS管 8.1 基础 MOS管原理图 MOS实物图 8.1.1 概念 8.1.2 特点 8.1.3 类型 7.2 相关问题 7.2.1 MOS管在不同应用中的阈值电压和最大漏极电流通常是多少? 7.2.2 如何根据电路设计选择合适的MOS管类型? 7.2.3 MOS管在高频应用中的优势是什么,它如何影响电路…

那些你不知道的3个comfyui小技巧,分享给大家!

前言 掌握一些小技巧&#xff0c;提升效率&#xff01; 1、图像选择器 出图批次是四张&#xff0c;然后想选一张图进入到之后的工作流&#xff0c;就可以用这个节点 默认是这样的 运行到这个节点的时候&#xff0c;会出现四张图片&#xff0c;选中满意的图片&#xff0c;点…