50. Pow(x, n) 快速幂

news2025/1/10 0:43:17

题目链接:力扣

 解题思路:直接使用for进行累乘会超时(时间复杂度O(n),n为指数n的大小),可以使用快速幂进行更快的幂运算(时间复杂度为O(logn))

快速幂:核心思想就是每一次把指数缩小一半,底数平方。对于a^n(a为底数,n为指数)

  1. 当n为偶数时,比如:a^10 = a^(2*5) = (a^2)^5,指数10缩小一般变为5,将底数a平方变为a^2(这个时候如果使用for循环求幂运算,只需要对a^2做5次累乘就可以了,相比10次累乘减少了一半的运算量)
  2. 当n为奇数时,比如:a^11,这个时候指数11缩小一半为5.5,但是指数不能为小数,可以先提取出一个底数a,a^11=a * a^10,然后对a^10进行指数缩小一半,底数平方的操作。
  3. 重复1和2,直到指数n为0

在上述过程中当指数为奇数时,都会分离出一个底数最终指数一定会变为1,这个时候结果为b^1, 此时n为奇数,提取出一个底数b,b^1=b * b^0,提取后n=0,算法结束。可见,只需要每次在指数为奇数的时候,把提取出来的底数累乘到最终结果result上(n为偶数时不进行累乘),当n=0时,result即为所求

比如2^11,按照上述算法流程,初始时result=1:

  1. 2^11,n为奇数,2^11=2 * 2^10,将提取出的底数累乘到result上,result=1*2=2,然后对2^10进行上述操作
  2. 2^10,n为偶数,2^10 = (2^2)^5=4^5,然后对4^5进行上述操作
  3. 4^5,n为奇数,4^5=4 * 4^4,将提取出来的底数累乘到result上,result = 2*4=8,然后对4^4进行上述操作
  4. 4^4,n为偶数,4^4 = (4^2)^2=16^2,然后对16^2进行上述操作
  5. 16^2,n为偶数,16^2 = (16^2)^1=256^1,然后对256^1进行上述操作
  6. 256^1,n为奇数,256^1 = 256 * 256^0,将提取出来的底数累乘到result上,result=8*256=2048,然后对256^0进行上述操作
  7. 256^0,n=0,算法结束,result=2048=2^11

由上述过程可见,只需要在n为奇数的时候,将提取出了的底数累乘到result上

快速幂代码

public static long quickPower(int base, int power) {
    long result = 1;
    while (power > 0) {
        if (power%2==0){//如果指数为偶数
            power = power /2 ;//把指数缩小为一半
            base = base * base;//把底数变大为原来的平方
        }else {//如果指数为奇数
            power = power-1;//把指数减去1,使其变为一个偶数
            result = result * base;//需要把提取出来的底数记录到结果中
            power=power/2; //减1后,指数为偶数,可以继续进行指数缩小为一半
            base = base *base; //底数变为原来的平方
        }
    }
    return result;
}

上述if和else代码中有重复性的代码,可以进行简化

n为偶数时

power = power /2;

n为奇数时

power = power-1;
power=power/2;

其实n为奇数时的这两行代码可以合并为一句

power = power /2;

 因为当n为奇数时,power/2 = (power-1)/2,因为在整形运算中,是向下取整的,比如(5-1)/2=5/2=4

简化后的快速幂算法:

public static long quickPower(int base, int power) {
    long result = 1;
    while (power != 0) {
        if (power % 2 == 1) {
            result = result * base;//需要把提取出来的底数记录到结果中
        }
        power = power / 2;//把指数缩小为一半
        base = base * base;//把底数变大为原来的平方
    }
    return result;
}

上述代码已经很简洁了,但是还可以进行优化,在计算机中位运算要比普通的加减乘除运算更快

power%2==1可以使用位运算代替,power为奇数时,二进制位的最后一位一定为1,如果最后一位不为1,则power为偶数,所以可以使用 power&1 得到power的最后一位。

power = power/2也可以替换为 power >>=1 的位运算

最终的快速幂算法实现:

public static long quickPower(int base, int power) {
    long result = 1;
    while (power != 0) {
        if ((power & 1) == 1) {
            result = result * base;//需要把提取出来的底数记录到结果中
        }
        power >>= 1;//把指数缩小为一半
        base = base * base;//把底数变大为原来的平方
    }
    return result;
}

明白了上述快速幂过程,这道题也就容易做了,因为n可能为负数,可以在n小于0时,令x=1/x,n=-n,这个时候就可以转化为正数的快速幂算法了,注意,转为正数时可能会发生整数溢出(当n为整数的最小值时),需要使用long类型保存n,然后对long类型进行负数转整数操作.

AC代码:

class Solution {
    public static double myPow(double x, int n) {
        double result = 1;
        //防止溢出
        long N = n;
        if (N < 0) {
            N = -N;
            x = 1 / x;
        }
        while (N != 0) {
            if ((N & 1) == 1) {
                result = result * x;
            }
            x *= x;
            N >>= 1;
        }
        return result;
    }
}

 

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

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

相关文章

华南农业大学|图像处理与分析技术综合设计|题目解答:读取电表示数

l 设计任务&#xff1a; ipa05.jpg是一幅电气柜上的电表图像&#xff0c;试采用图像处理与分析技术&#xff0c;设计适当的 算法和程序&#xff0c;找出电流表所在的区域&#xff0c;提取其指针位置&#xff0c;计算指针与表盘下沿 的夹角&#xff0c;进而判断当前电表的读数…

车载软件架构——车载诊断软件框架

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑&#xff1a;你的价值、你的能力、你的…

vue2+AntdesignVue a-input使用颜色选择器

不需要任何插件即可实现颜色选择器 a-input type设置为color即可 回调函数

vue进阶-消息的订阅与发布

&#x1f4d6;vue基础学习-组件 介绍了嵌套组件间父子组件通过 props 属性进行传参。子组件传递数据给父组件通过 $emit() 返回自定义事件&#xff0c;父组件调用自定义事件接收子组件返回参数。 &#x1f4d6;vue进阶-vue-route 介绍了路由组件传参&#xff0c;两种方式&…

Spring MVC异步上传、跨服务器上传和文件下载

一、异步上传 之前的上传方案&#xff0c;在上传成功后都会跳转页面。而在实际开发中&#xff0c;很多情况下上传后不进行跳转&#xff0c;而是进行页面的局部刷新&#xff0c;比如&#xff1a;上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。 1.1 JSP页面 …

PT:report_timing实用技巧

report_timing -start_end_pair 默认report_timing -to 会报告到endpoint最差一条violation path。 用report_timing -max_path X就会报告到endpoint的X条path&#xff0c;每组startpoint /endpoint只报告最差的一条(在X范围内有多少报多少&#xff0c;下面同理)。 用report…

Android 生成pdf文件

Android 生成pdf文件 1.使用官方的方式 使用官方的方式也就是PdfDocument类的使用 1.1 基本使用 /**** 将tv内容写入到pdf文件*/RequiresApi(api Build.VERSION_CODES.KITKAT)private void newPdf() {// 创建一个PDF文本对象PdfDocument document new PdfDocument();//创建…

什么是从人类反馈中强化学习(RLHF)?

自从OpenAI公司发布ChatGPT以来&#xff0c;人们对大型语言模型(LLM)的这一重大进步感到兴奋。虽然ChatGPT与其他最先进的大型语言模型大小相同&#xff0c;但其性能要高得多&#xff0c;并且承诺支持新的应用程序或颠覆取代原有的应用程序。 ChatGPT的惊人表现背后的主要原因…

NAT—网络地址转换

目录 静态NAT 动态NAT NAPT—easy IP 多对多的NAPT 端口映射—高级用法 NAT—网络地址转换 IPV4地址不够用 NAT ABC—三类地址中截取了一部分地址&#xff08;并且让这部分地址可以重复使用&#xff09;—私网地址 A类地址中&#xff1a;10.0.0.0-10.255.255.255 &#xff08;…

3. 学习分类 - 基于图像大小进行分类

3.1 设置问题 根据图片的尺寸&#xff0c;把图片分为纵向图像和横向图像。这种把图像分成两种类别的问题&#xff0c;就是二分类问题。 纵向图片示例&#xff1a; 横向图片示例&#xff1a; 这样就有了两个训练数据&#xff1a; 增加训练数据&#xff0c;并在图像中表示出来…

mac批量修改文件名为不同名字

mac批量修改文件名为不同名字怎么弄&#xff1f;很多小伙伴通过私信向我求助&#xff0c;用什么方法可以在mac电脑上批量修改文件名称&#xff0c;将大量文件修改成不同的名称。这可能是一项比较麻烦的操作&#xff0c;在电脑上进行过批量重命名的小伙伴都知道&#xff0c;一般…

汉服小姐姐【InsCode Stable Diffusion美图活动一期】

一、 Stable Diffusion 模型在线使用地址&#xff1a;https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型版本及相关配置&#xff1a; 模型&#xff1a;majicmixRealistic_v6 Lora&#xff1a;hanfu_ming 采样迭代步数&#xff08;steps&#xff09;: 40 采样方法&am…

SCB后备保护器——保护电器的后备力量

在现代社会中&#xff0c;电力设备已经成为了不可或缺的一部分&#xff0c;而在使用电力设备的过程中&#xff0c;由于各种原因&#xff0c;电力设备可能会受到电涌的影响&#xff0c;从而导致设备损坏或者火灾事故的发生。为了有效保护电力设备的安全稳定运行&#xff0c;研发…

数据科学分析全流程步骤

知识图谱以结构化的“知识”来存储与表示海量数据&#xff0c;作为承载底层海量知识并支持上层智能应用的重要载体&#xff0c;它在智能时代中扮演了极其重要的角色。然而&#xff0c;由于知识图谱高度结构化的特点&#xff0c;我们常常需要构建结构化查询语句&#xff08;SPAR…

卷积神经网络(CNN)原理详解

近些年人工智能发展迅速&#xff0c;在图像识别、语音识别、物体识别等各种场景上深度学习取得了巨大的成功&#xff0c;例如AlphaGo击败世界围棋冠军&#xff0c;iPhone X内置了人脸识别解锁功能等等&#xff0c;很多AI产品在世界上引起了很大的轰动。 而其中 卷积神经网络&am…

微服务 云原生:gRPC 客户端、服务端的通信原理

gRPC Hello World protoc 是 Protobuf 的核心工具&#xff0c;用于编写 .proto 文件并生成 protobuf 代码。在这里&#xff0c;以 Go 语言代码为例&#xff0c;进行 gRPC 相关代码编写。 下载 protoc 工具&#xff1a;https://github.com/protocolbuffers/protobuf/releases&a…

饭堂人群密度检测之Pythton

完整资料进入【数字空间】查看——baidu搜索"writebug" 一、饭堂人群密度检测 二、选题背景 在这个人工智能快速发展的时代&#xff0c;智能交通、智能机器人等人工智能化产品不断出现。作为人工智能的重要分支&#xff0c;计算机视觉起到了重要作用。它通过一系列的…

面试题更新之-使用 base64 编码的优缺点

文章目录 base64 编码是什么&#xff1f;使用 base64 编码的优缺点 base64 编码是什么&#xff1f; Base64编码是一种将二进制数据转换为ASCII字符的编码方式。它将三个字节的二进制数据分割成四组&#xff0c;每组6个比特&#xff0c;然后将这些6个比特转换为可打印的ASCII字…

前端学习——Web API (Day5)

BOM操作 Window对象 BOM 定时器-延时函数 案例 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&q…

XSS 攻击的检测和修复方法

XSS 攻击的检测和修复方法 XSS&#xff08;Cross-Site Scripting&#xff09;攻击是一种最为常见和危险的 Web 攻击&#xff0c;即攻击者通过在 Web 页面中注入恶意代码&#xff0c;使得用户在访问该页面时&#xff0c;恶意代码被执行&#xff0c;从而导致用户信息泄露、账户被…