【题解】《算法零基础100讲》(第15讲) 二分快速幂(java版)

😁算法小白欢迎加入此社区:https://bbs.csdn.net/forums/hero?category=0
由英雄大佬带领的抱团学算法队伍,从0开始,期待你的加入
🥳
在这里插入图片描述
本博文是对此文章习题所作的题解,如有不足,请多指教:https://blog.csdn.net/WhereIsHeroFrom/article/details/121134510

今日题解:
第一题:https://leetcode-cn.com/problems/powx-n/
在这里插入图片描述

我们如果想计算一个数的几次幂,比如你要求 2的4次幂,你可以把它看成 2的2次方再平方,我们2的2次方也可以看作2的一次方再平方,这样层层剥开,直到到 1 次方。这样我们只需要考虑题目给你的是奇数次幂还是偶数次幂。再分别考虑就可以了。

class Solution {
    public double myPow(double x, int n) {
        long number = n;
        if(number >= 0){
            return quickMul(x,number);
        }else{
            return 1.0/quickMul(x, -number);/*对负数的处理*/
        }
    }
    double quickMul(double x, long number) {
        if (number == 0) {
            return 1.0; /* 0次幂的时候 */
        }
        double y = quickMul(x, number/2); 
        if(number%2==0){
            return y*y; /*偶数次幂*/
        }
        else{
            return y*y*x; /*如果是奇数次幂,我移出来一个x*/
        }
    }
}

在这里插入图片描述
第二题:https://leetcode-cn.com/problems/super-pow/
在这里插入图片描述
在这里插入图片描述

这个题他写的是指数可能非常大,所以你使用 int 是放不下的,所以这个题说你要对1337取模运算,那么我们还是要考虑奇偶次幂之分,我们看一个小栗子:

在这里插入图片描述
我们这里补充一个公式的推到,会用得到:
在这里插入图片描述

/*参考一个b站大佬的思路*/
class Solution {
    int temp = 1337;
    public int superPow(int a, int[] b) {
        Deque<Integer> queue = new ArrayDeque<>();/*数据结构转变*/

        for(int num:b){
            queue.addLast(num);/*加入*/ 
        }
        return superPow(a,queue);/*重写方法*/
    }
    private int superPow(int a,Deque<Integer> queue){
        if(queue.isEmpty()){/*如果是空返回1,任何数0次幂都返回1*/ 
            return 1;
        }
        int lastBit = queue.removeLast();
        int x1 = myPow(a,lastBit);/* 相当于我上图显示里面的a的8次方*/
        int x2 = myPow(superPow(a,queue),10);/*相当于弹出上面这部分后,剩下的部分*/

        return (x1*x2)%temp;/*结果可能大于1337,所以取模*/
    }

    private int myPow(int a,int b){
        if(b==0){/*0次幂*/
            return 1;
        }
        if(b%2==0){/*b是偶数 */
            return myPow(((a%temp)*(a%temp))%temp,b/2);/*见上图的推到公式*/
        }else{/*奇数的话,就抽一个出来变成偶数*/
            return ((a%temp)*myPow(a,b-1))%temp;
        }
    }
}

在这里插入图片描述

第三题:https://leetcode-cn.com/problems/maximize-number-of-nice-divisors/
在这里插入图片描述
在这里插入图片描述
联动XingleiGao
大佬的文章:
https://blog.csdn.net/qq_17593855/article/details/121053105
https://blog.csdn.net/qq_17593855/article/details/121137211

有问题欢迎留言,欢迎加入“万人千题”社区,在这里一起努力。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码的xiaolang

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值