LeetCode刷题——超级次方#372#Medium

超级次方的思路探讨与源码
    超级次方的题目如下图,该题属于数学类和分治类型的题目,主要考察对于递推方法的使用和题目数学思路的理解。本文的题目作者想到2种方法,分别是倒序遍历方法和正序遍历方法,其中倒序遍历方法使用Java进行编写,而正序遍历方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
在这里插入图片描述
    本人认为该题目可以倒序遍历方法的思路进行解决,首先实现一个倒序遍历计算次方的函数,该函数内部先进行初始化,然后判断当前传入数字是否为0,如果不为0则开始遍历,判断数字是否是奇数,如果是奇数则将数字进行倒序的迭代计算,直到遍历结束并返回结果。而在主函数内,先初始化一个数字,然后开始遍历循环,调用计算次方的函数后和当前的历史结果计算并进行取余数操作,直到循环遍历结束后,将最终结果返回。那么按照这个思路我们的Java代码如下:

#喷火龙与水箭龟
class Solution {
    static final int IND = 1337;
    public int superPow(int a, int[] b) {
        int res = 1;
        for (int ir = b.length - 1; ir >= 0;ir--) {
            res = (int) ((long) res * pow(a, b[ir]) % IND);
            a = pow(a, 10);
        }
        return res;
    }

    public int pow(int x, int n) {
        int vex = 1;
        while (n != 0) {
            if (n % 2 != 0) {
                vex = (int) ((long) vex * x % IND);
            }
            x = (int) ((long) x * x % IND);
            n = n/2;
        }
        return vex;
    }
}

在这里插入图片描述
    显然,我们倒序遍历方法的效果一般,同时还可以使用正序遍历的方法解决。首先初始化参数,然后开始遍历循环,将结果直接调用系统的次方函数进行迭代正序计算,直到最终循环结束并返回结果。所以按照这个思路就可以解决,下面是Python代码:

#喷火龙与水箭龟
class Solution:
    def superPow(self, a: int, b: List[int]) -> int:
        NUM = 1337
        res = 1
        for jr in b:
            res = pow(res, 10, NUM) * pow(a, jr, NUM) % NUM
        return res

在这里插入图片描述
    从结果来说Java版本倒序遍历方法的效率一般,而Python版本的正序遍历方法的速度也较为一般,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值