LeetCode-50. Pow(x, n)

来源:互联网 发布:个体户办淘宝企业店铺 编辑:程序博客网 时间:2024/05/22 05:18

问题描述

实现自己的次幂函数,返回x^n的值。

解题思路

解题思路参考自这篇博客
1. 利用递归
依次递归求解double res=Pow(x,n/2),然后返回res*res或者res*res*n(前者n为偶数,后者为奇数);而不是直接返回Pow(x,n/2)*Pow(x,n/2)或者Pow(x,n/2)*Pow(x,n/2)*x。另外,需要考虑边界的问题,如果x=0,x=1,x<0,以及x=Integer.MIN_VALUE。
2. 利用动态规划
我们可以尝试将x^n分解,以x^13为例,13的二进制数为1101,上式可以分解为m13=m8m4m1,可以得出结论:二进制数的第一位对应值为m1,第二位对应值为第一位的平方m2,第三位对应值为第二位的平方 m4 ,依次类推;并得知如果该位是1,所得的最终解需要乘以改位所对应的值;

代码

递归

public class Solution {    public double myPow(double x, int n) {        if(n==0)            return 1;        if(n==1)            return x;        int tem=n/2;        if(n<0){            tem=-tem;            x=1/x;        }        double res=myPow(x,tem);        if(n%2==0)            return res*res;        return res*res*x;    }}

动态规划

public class Solution {    public double myPow(double x, int n) {        if(n==0)            return 1;        if(n==1)            return x;        int m=(n<0?-n-1:n);//处理n为负数的情况        double result=1;        for(double p=x;m>0;m/=2){            if((m & 1)!=0)                result*=p;            p*=p;        }        if(n<0){            return 1/result/x;        }        return result;    }}
原创粉丝点击