剑指 Offer 16. 数值的整数次方
难度: m i d d l e \color{orange}{middle} middle
题目描述
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,x^{n})。不得使用库函数,同时不需要考虑大数问题。
示例 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 -100.0 < x < 100.0 −100.0<x<100.0
- − 2 31 < = n < = 2 31 − 1 -2^{31} <= n <= 2^{31}-1 −231<=n<=231−1
- − 1 0 4 < = x n < = 1 0 4 -10^{4} <= x^{n} <= 10^{4} −104<=xn<=104
注意:本题与主站 50 题相同:https://leetcode-cn.com/problems/powx-n/
算法
(快速幂算法)
快速幂实际上是二分思想的一种应用。
- 当 n n n 是 奇数 的时候 a n = a n / 2 ∗ a n / 2 a^n = a^{n/2} *a^{n/2} an=an/2∗an/2
- 当 n n n 是 偶数 的时候 a n = a n − 1 / 2 ∗ a n − 1 / 2 ∗ a a^n = a^{n - 1/2} *a^{n- 1/2} * a an=an−1/2∗an−1/2∗a
复杂度分析
-
时间复杂度: O ( l o g 2 n ) O(log_2n) O(log2n)
-
空间复杂度 : O ( 1 ) O(1) O(1)
C++ 代码
class Solution {
public:
double quickmul(double x, long long m) {
if (m == 0) return 1.0;
double result = myPow(x, m >> 1);
result *= result;
if (m & 1 == 1) result *= x;
return result;
}
double myPow(double x, int n) {
long long m = n;// 不能直接用n做计算。
if (n >= 0) return quickmul(x, m);
return 1.0 / quickmul(x, -m);
}
};
相关文章
- java 16进制数据格式化处理工具类,16进制byte数组转String
- 攻击 CDN 缓存服务器赚到 16,500 美元
- 基于pytorch的自然语言处理情感分析和pytorch第三次入门到放弃结束2021.8.16
- 16. 最接近的三数之和
- node 16.X 或更高版本 fibers 出错 is missing.「建议收藏」
- 接口测试第16讲:总结
- react源码解析16.concurrent模式_2023-03-15
- CRC-16校验和实现
- 腾讯云16核32G28M服务器性能测评
- 【C++修炼之路】16.C++多态
- 为了让16岁的儿子从轮椅上站起来,这位机器人工程师父亲打造了一套外骨骼装置
- Python 人工智能:16~20
- 全国新冠疫苗接种超16亿剂次 针对德尔塔毒株仍有保护作用
- 华为16款新品价格一览:从449元到29999元谁是你的菜?
- 16、团队建设该从哪里入手?
- Linux系统16位时代的崛起(linux16位)