标签:dReturn return int double 复杂度 50 QuickMul Pow leetcode
1.问题描述
https://leetcode-cn.com/problems/powx-n/
2. 解题代码
2.1. 基本解法
public double MyPow(double x, int n)
{
if (x == 1 || n == 0)
{
return 1;
}
if (n == 1)
{
return x;
}
double dReturn = x;
int num = n;
if (n < 0)
{
dReturn = 1 / x;
num = n * -1;
}
else
{
dReturn = dReturn * dReturn;
}
for (int i = 2; i <= num;)
{
if (i * 2 > num)
{
if (n > 0)
{
dReturn = dReturn * x;
}
else
{
dReturn = dReturn / x;
}
i = i + 1;
}
else
{
dReturn = dReturn * dReturn;
i = i * 2;
}
}
return dReturn;
}
2.2. 快速幂 + 递归解法
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(\log n)O(logn),即为递归的层数。
-
空间复杂度:O(\log n)O(logn),即为递归的层数。这是由于递归的函数调用会使用栈空间。
2.2. 快速幂 + 迭代解法
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;
// 贡献的初始值为 x
double 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(\log n)O(logn),即为对 nn 进行二进制拆分的时间复杂度。
-
空间复杂度:O(1)O(1)。
标签:dReturn,return,int,double,复杂度,50,QuickMul,Pow,leetcode 来源: https://blog.csdn.net/a13407142317/article/details/123193537
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。