leetcode算法总结 —— 快速幂算法
文章目录
- 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算法总结 —— 快速幂算法相关推荐
- RSA密码的手动算法+快速幂算法
公钥加密方案(非对称加密算法) 1.为什么要引入公钥加密方案? 密码学中的加密方案分成对称密钥和非对称密钥(也就是我们说的公钥加密,代表加密算法是RSA加密算法). 而对称加密方法有一个特点,任何通信 ...
- 快速幂算法c语言求a的n次方,快速幂算法(数学)
什么是快速幂算法? 快速幂算法能帮我们算出指数非常大的幂,传统的求幂算法之所以时间复杂度非常高(为O(指数n)),就是因为当指数n非常大的时候,需要执行的循环操作次数也非常大.所以我们快速幂算法的核心 ...
- 快速幂算法相关题目(Leetcode题解-Python语言)
50. Pow(x, n) 快速幂算法的目的,就是快速计算 x 的 n 次方.基本思路是把 n 视作二进制数,则 n 可以被分解为多个 2 的幂次方之和,如 12 对应 1100 等于 0∗20+0∗ ...
- 六十八、快速幂算法、牛顿迭代法、累加数组+二分查找的变形
@Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 上次介绍了二分查找算法及其四个变形问题,下面介绍二分法常用的场景和典 ...
- java位运算求幂,程序员必学:快速幂算法
前阵子,有小伙伴在我B站的算法教程底下留言 小伙伴们有任何疑问或者希望我解说任何内容,都可以在我的小我私家B站或民众号(xmg_mj)留言哦,我会尽我最大能力.只管抽时间去写文章\录视频来回应人人. ...
- LeetCode50——一题学会快速幂算法
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode的第31篇文章,我们来看下LeetCode的第50题,求一个数的幂. 题意 这道题的题意只有一句话,就是给定两个数x和 ...
- 数据结构与算法:快速幂——求幂运算 O(logN)
前言:普通的求幂问题,相信大家已经屡见不鲜,无非就是 纯暴力 解法,或者直接调用公式:Math.Pow(底数, 指数) 一步得出.但这两种算法只能使得时间复杂度保持在 O(n).而且公式一步的得往往 ...
- 【复习】快速幂算法详解
快速幂算法 就是求一个高精度幂次取余时的一个快速算法 比如我们要求aba^bab%m的时候 应用于快速幂算法 也就是将O(n)转化为O(logn)的算法 他的原理就是: 252^525 = 2∗2∗2 ...
- 【算法分析与设计】快速幂算法与快速幂取模算法
文章目录 快速幂算法 算法分析 算法实现 位运算优化 BigInteger支持 快速幂取模算法 算法优点 算法推导 算法实现 BigInteger支持 本文完整代码实现(Java语言描述) 快速幂算法 ...
最新文章
- 包邮送25本经典书籍,无任何套路!
- 23LC1024四线访问数据
- OpenGL的简单研究-开端
- python怎么安装pyecharts_基于Python安装pyecharts所遇的问题及解决方法
- vb 通过php连接mysql数据库连接_vb如何mysql数据库连接
- 导航第四版-分类专栏
- 谷歌要构建自己的区块链技术
- 彻底弄懂TIME_WAIT 及 tcp_tw_reuse选项
- javah 找不到类文件的解决办法
- pdfobject div中预览pdf
- 分析光固化3D打印的优势
- 18-(基础入门篇)GPRS(Air202)拨打电话
- qt样式表设置边框_Qt样式表之 QSS 语法介绍
- 如何书写批处理文件?(批处理文件的介绍及编写规范)
- html基础学习笔记
- 浅显易懂的理解SQL各种锁(基于MYSQL 8.0.28)
- 20220321 Unity 3D修改项目名称和图标
- C语言输出各种类型数据的方式
- 【思前享后】区块链应用
- NB-IoT通信模组/模块
热门文章
- 南阳理工学院计算机专业很强吗,南阳理工学院最好的专业?实力最强的是那个专业...
- 计算机专业上哈工大还是华中科技,中国工科第二的高校到底是哪所?浙大、上交、哈工大还是华科?...
- MySQl 面试重点_2.常见的索引面试题总结
- 一次 G1 堆大小不均问题的排查及解决
- 建立自己的网络电话服务器
- 前端工程师——思维导图
- mx150 宏碁swift3_宏碁Swift 3评测:炫美轻薄还有MX150独显
- c语言的malloc写法,C语言malloc用法
- lifi与wifi的论文_lifi和wifi的区别在哪里?
- 加速Eclipse使其成为超快的IDE