文章目录

  • 1. 引出快速幂算法
  • 2. 简化语句
  • 3. 使用位运算来提升性能
  • 4. 对应leetcode题型

参考的是大神的文章,这篇文章相当好
https://blog.csdn.net/qq_19782019/article/details/85621386

1. 引出快速幂算法

3 ^ 10 = 3*3*3*3*3*3*3*3*3*3计算这个我们可以循环乘3但是时间复杂度为O(N)
那么我们可以用3 ^ 10 = 9 ^ 5来简化计算
此时指数由10缩减一半变成了5,而底数变成了原来的平方,求3^10原本需要执行10次循环操作,求9 ^ 5却只需要执行5次循环操作

例如2 ^ 10000 = 4 ^ 5000 底数只是做了一个小小的平方操作,而指数就从10000变成了5000,减少了5000次的循环操作。
所以现在我们的问题是如何把指数5变成原来的一半
另一种方法能表示9 ^ 5
9 ^ 5 =(9 ^ 4)*(9 ^ 1)
这里即为9 ^ 1,这个9 ^ 1 我们先单独移出来,剩下的9 ^ 4又能够在执行“缩指数”操作了,把指数缩小一半,底数执行平方操作
9 ^ 5=(81 ^ 2)* ( 9 ^ 1)
把指数缩小一半,底数执行平方操作
9 ^ 5=(6561 ^ 1)* (9 ^ 1)
接下来我们就可以用代码实现快速幂了。
中心思想就是:每次操作都将底数翻倍,指数变为原来都一半
时间复杂度类似于二分算法,为O(logn) 比之前的时间复杂度O(N)降低很多了

long long fastPower(long long base, long long power)
{long 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;  //此时指数为偶数,可以继续执行操作base = base * base; //底数变大成原来的平方}}return result;
}

2. 简化语句

接下来我们精简代码,简化语句

long long fastPower(long long base, long long power)
{long long result = 1;while (power > 0){//当为指数奇数的时候if (power % 2 == 1){result = result * base; //收集此时的一次方}//power减半和power减一减半结果一样,然后base翻倍power = power / 2;base = (base * base);}return result;
}

3. 使用位运算来提升性能

long long fastPower(long long base, long long power)
{long long result = 1;while (power > 0){if (power & 1){ //此处等价于(power%2==1), power & 1 若为奇数则结果为trueresult = result * base;}power = power >> 1; //此处等价于power=power/2, 一个数右移power >> 1 一位等于他除以2base = (base * base);}return result;
}

4. 对应leetcode题型

https://leetcode-cn.com/problems/powx-n/
这个题我们直接提取一个快速幂方法,然后考虑一些边界条件即可。

class Solution {public:double myPow(double x, int n) {double res = 1;//如果n是0if(n == 0) return res;//如果n是负数,先把n转正bool flag = true;if(n < 0) {//转正都时候可能溢出if(n == INT_MIN){res *= x;n++;}n = -n;flag = false;}//快速幂算法while(n > 1) {if((n & 1) == 0) {//如果是偶数,我们直接除以2降幂n = n >> 1;x = x*x;} else { //如果是奇数,我们减一降幂n--;res *= x;}}res *= x;if(flag == false) return 1/res;return res;}
};

leetcode算法总结 —— 快速幂算法相关推荐

  1. RSA密码的手动算法+快速幂算法

    公钥加密方案(非对称加密算法) 1.为什么要引入公钥加密方案? 密码学中的加密方案分成对称密钥和非对称密钥(也就是我们说的公钥加密,代表加密算法是RSA加密算法). 而对称加密方法有一个特点,任何通信 ...

  2. 快速幂算法c语言求a的n次方,快速幂算法(数学)

    什么是快速幂算法? 快速幂算法能帮我们算出指数非常大的幂,传统的求幂算法之所以时间复杂度非常高(为O(指数n)),就是因为当指数n非常大的时候,需要执行的循环操作次数也非常大.所以我们快速幂算法的核心 ...

  3. 快速幂算法相关题目(Leetcode题解-Python语言)

    50. Pow(x, n) 快速幂算法的目的,就是快速计算 x 的 n 次方.基本思路是把 n 视作二进制数,则 n 可以被分解为多个 2 的幂次方之和,如 12 对应 1100 等于 0∗20+0∗ ...

  4. 六十八、快速幂算法、牛顿迭代法、累加数组+二分查找的变形

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 上次介绍了二分查找算法及其四个变形问题,下面介绍二分法常用的场景和典 ...

  5. java位运算求幂,程序员必学:快速幂算法

    前阵子,有小伙伴在我B站的算法教程底下留言 小伙伴们有任何疑问或者希望我解说任何内容,都可以在我的小我私家B站或民众号(xmg_mj)留言哦,我会尽我最大能力.只管抽时间去写文章\录视频来回应人人. ...

  6. LeetCode50——一题学会快速幂算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode的第31篇文章,我们来看下LeetCode的第50题,求一个数的幂. 题意 这道题的题意只有一句话,就是给定两个数x和 ...

  7. 数据结构与算法:快速幂——求幂运算 O(logN)

    前言:普通的求幂问题,相信大家已经屡见不鲜,无非就是 纯暴力 解法,或者直接调用公式:Math.Pow(底数, 指数)  一步得出.但这两种算法只能使得时间复杂度保持在 O(n).而且公式一步的得往往 ...

  8. 【复习】快速幂算法详解

    快速幂算法 就是求一个高精度幂次取余时的一个快速算法 比如我们要求aba^bab%m的时候 应用于快速幂算法 也就是将O(n)转化为O(logn)的算法 他的原理就是: 252^525 = 2∗2∗2 ...

  9. 【算法分析与设计】快速幂算法与快速幂取模算法

    文章目录 快速幂算法 算法分析 算法实现 位运算优化 BigInteger支持 快速幂取模算法 算法优点 算法推导 算法实现 BigInteger支持 本文完整代码实现(Java语言描述) 快速幂算法 ...

最新文章

  1. 包邮送25本经典书籍,无任何套路!
  2. 23LC1024四线访问数据
  3. OpenGL的简单研究-开端
  4. python怎么安装pyecharts_基于Python安装pyecharts所遇的问题及解决方法
  5. vb 通过php连接mysql数据库连接_vb如何mysql数据库连接
  6. 导航第四版-分类专栏
  7. 谷歌要构建自己的区块链技术
  8. 彻底弄懂TIME_WAIT 及 tcp_tw_reuse选项
  9. javah 找不到类文件的解决办法
  10. pdfobject div中预览pdf
  11. 分析光固化3D打印的优势
  12. 18-(基础入门篇)GPRS(Air202)拨打电话
  13. qt样式表设置边框_Qt样式表之 QSS 语法介绍
  14. 如何书写批处理文件?(批处理文件的介绍及编写规范)
  15. html基础学习笔记
  16. 浅显易懂的理解SQL各种锁(基于MYSQL 8.0.28)
  17. 20220321 Unity 3D修改项目名称和图标
  18. C语言输出各种类型数据的方式
  19. 【思前享后】区块链应用
  20. NB-IoT通信模组/模块

热门文章

  1. 南阳理工学院计算机专业很强吗,南阳理工学院最好的专业?实力最强的是那个专业...
  2. 计算机专业上哈工大还是华中科技,中国工科第二的高校到底是哪所?浙大、上交、哈工大还是华科?...
  3. MySQl 面试重点_2.常见的索引面试题总结
  4. 一次 G1 堆大小不均问题的排查及解决
  5. 建立自己的网络电话服务器
  6. 前端工程师——思维导图
  7. mx150 宏碁swift3_宏碁Swift 3评测:炫美轻薄还有MX150独显
  8. c语言的malloc写法,C语言malloc用法
  9. lifi与wifi的论文_lifi和wifi的区别在哪里?
  10. 加速Eclipse使其成为超快的IDE