剑指leetcode—Pow(x, n)(快速幂)

题目描述:实现 pow(x, n) ,即计算 x 的 n 次幂函数。

示例 1:

输入: 2.00000, 10
输出: 1024.00000

示例 2:

输入: 2.10000, 3
输出: 9.26100

示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25

说明:

-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

首先最容易想到的是利用for循环,如果x=5,n等于64,那么for循环需要执行64次,效率很低,这个题有一个更高效的解法

快速幂(递归实现)

class Solution {
double quickmul(double x,long  n)
{
	if(n==0)
	return 1.0;
	else
	{
		double temp=quickmul(x,n/2);
		if(n%2==0)
		return temp*temp;
		else
		return temp*temp*x;
	}
}
    public double myPow(double x, int n) {
			long  N=n;
			double res;
			return res=N>=0? quickmul(x,N):1.0/quickmul(x,-N);
    }
}

快速幂循环迭代实现

迭代实现参考leetcode官方题解

首先举一个例子,从中看出规律
在这里插入图片描述

  • x^38到 x^77,额外多乘的x,对于最终的结果来说是贡献了x
  • x^9到 x^19,额外多乘的x,对于最终的结果来说贡献了 x^4
  • x^4到 x^9,额外多乘的x,对于最终的结果来说贡献了 x^8
  • 最一开始的x,对于最终的结果来说是平方了6次,贡献了x^64
    把所有的贡献相乘,就可以得到最终的结果x^77,而这些贡献的指数部分都是2的幂次,每个额外乘的x在之后都会被平方若干次,而指数1,4,8,64,就是对应了77的二进制数(1001101)(二进制)中的每一个1.
    剑指leetcode—Pow(x, n)(快速幂)_第1张图片

java代码实现

class Solution {
double quickmul(double x,long  n)
{
    //作为结果返回
	double ans=1.0;
    //贡献的初始值是x
    double temp=x;
    while(n>0)
    {
        if(n%2==1)
        {
        //如果 n 二进制表示的最低位为 1,那么需要计入贡献
            ans*=temp;
        }
         // 将贡献不断地平方
        temp*=temp;
        //舍弃n此时的二进制位,方便计算下一位二进制的最低位
        //对一个数除2就可以舍弃最低位二进制位
        n/=2;
    }
    return ans;
}
    public double myPow(double x, int n) {
			long N=n;
			double res;
			return res=N>0? quickmul(x,N):1.0/quickmul(x,-N);
    }
}

你可能感兴趣的:(leetcode刷题之路,leetcode,算法,java)