lintcode--x的n次幂

实现 pow(x,n)

 注意事项

不用担心精度,当答案和标准输出差绝对值小于1e-3时都算正确

样例
Pow(2.1, 3) = 9.261
Pow(0, 1) = 0

Pow(1, 0) = 1

/** 暴力很简单就可以实现,算法的复杂度是O(N),那么有什么办法可以优化呢,现在是O(N),那么就要朝着O(logN)的方向进行优化,以25为例X^25,可以先考虑X^1, X^2 ,X^4, X^8, X^16,然而还差X^9,同理我们将9分解为X^1, X^2 ,X^4, X^8,余下的就是X^1,将每个步骤的最大次方提取出来就是X^16,X^8,X^1,其实就是将25分解成16,8,1也就是25的二进制表示11001。把25分解后如何处理呢,遍历25的每一位i,如果是1,那么result *= X(2^i),最后也就求出X^25 = X^1 * X^8 *X^16。 1)最直观容易想到的方法就是用递归方法求n个x的乘积,注意考虑n的正负号,时间复杂度为O(n) 2)考虑到n个x相乘式子的对称关系,可以对上述方法进行改进,从而得到一种时间复杂度为O(logn)的方法,递归关系可以表示为pow(x,n) = pow(x,n/2)*pow(x,n-n/2) //下面使用二分法求解,不过因为两个的子解是一样的, //所以可以只求一边解就可以了,这就是最典型的减治法了。 *///博客 public class Solution {     public double myPow(double x, int n) {         if (n == 0) return 1;         if (n == 1)  return x;         //用于判断正负         boolean flag = false;         if (n < 0) {             flag = true;             n *= -1;         }         //递归关系可以表示为pow(x,n) = pow(x,n/2)*pow(x,n-n/2)         int k = n / 2;//4/2=2  2/2=1         int l = n - k * 2;//4-4=0 0         double t1 = myPow(x, k);//         double t2 = myPow(x, l);         if (flag == true) {             return 1/(t1*t1*t2);         } else {             return t1*t1*t2;         }     } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值