力扣第50题-Pow(x, n)

今天刷力扣每日一题,刷到了Pow(x, n)这个题,题目的意思就是:输入两个数x,n(-100.0 < x < 100.0,n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1]);求x的n次幂。乍一听这个题很简单,直接暴力循环乘就行了,时间复杂度还是O(N),没想到力扣果然是力扣,每到题都是有深意的,暴力直接报超时;

class Solution {    
	public double myPow(double x, int n) {        
		long N=n;;        
		if(N<0)return 1/quilckMul(x,-N);        
		else return quilckMul(x,N);    
	}    
	public double quilckMul(double x, long n){        
		double res=1.0;        
		for(int i=1;i<=n;i++){            
			res*=x;        
		}        
		return res;    
	}
}


后来想着改进了一下,每次乘一个x太费劲了,每次扩大二倍怎么样?于是就写下了如下代码,

class Solution {
    public double myPow(double x, int n) {
        if(n==0)return 1.0;
        if(n<0){
            return 1/myPowSon(x,-n);
        }else return myPowSon(x,n);
    }
    public double myPowSon(double x,int n){
        int i=1;
        double res=x;
        while((i+i)<=n){
            res=res*res;
            i=i+i;
        }
        if (i==n)return res;
        for(;i<n;i++){
            res=res*x;
        }
        return res;
    }
}

让结果res每次扩大二倍,在扩大前判断乘的次数 i 是否超过了n,如果未超过就,继续扩大,超过了就结束,这样做的目的是尽量的让i接近n,来减少暴力次数,不过时间复杂度还是O(N)。结果还是超时。

在这里插入图片描述
还是n为最大边界值是超时了。

后来还是忍不住看了官方解法,这里主要有两种解法,递归和迭代。
这里先讲一下比较好理解的递归解法吧;这里先贴一下代码,可以先跟着代码自己理解一下,

class Solution {
    public double myPow(double x, int n) {
        long N=n;
        if(N==0)return 1.0;
        if(N<0l)return 1/quilckMul(x, -N);
        else return quilckMul(x,N);
    }
    public double quilckMul(double x, long n){
        if(n==1)return x;
        double y=quilckMul(x,n/2);
        return n%2==0 ? y*y: y*y*x;
    }
}

递归的本质就是利用二分思想,其实我发现如果要求 O(logn)的复杂度的话,一般都是先考虑二分思想。

这道题 因为 (x的n次幂)=(x的n/2次幂)*(x的n/2次幂),然后把(x的n/2次幂)再当成一个整体去考虑,可以递归传入参数改变n的值 直到n降低为1,但这里有个问题就是如果x为奇数的话不能呗2整除怎么办?
那么就把n变为偶数就行了,就像代码中写的那样(x的n奇次幂)=(x的n/2的次幂)乘 (x的n/2的次幂)乘(x);这样的话就把x转化为偶数了。直到递归n的值唯一,确定递归的结束条件,就可以了。

这里就难想到的就是迭代思想,非常巧妙,也比较难以理解,代码先贴上,老铁们先加以理解一下,
在这里插入图片描述
由于代码粘不上这里上个图,这是官方的解法,我看这个解法也是思考的了为什么这么解,这里给出我的思路,

最主要的就是x的n次幂可以写成 x^n = x^n1 * x^n2 *x^ n3 x^nl =x^(n1+n2+…+nl); 这里的 (n1+n2+…+nl)=n ;其实就是把n拆分成几个数相加,那么什么数相加等于n哪,那就是二进制,二进制可以表示任意一位整数。所以把x的n次幂传换成n的二进制次幂就可以了。

具体题目请看:https://leetcode-cn.com/problems/powx-n/solution/powx-n-by-leetcode-solution/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值