LeetCode第50题Pow(x, n)

简介: LeetCode第50题"Pow(x, n)"的解题方法,运用分而治之的策略,通过快速幂算法高效计算幂函数的结果。

国庆放假结束一周了,收心,开始学习技术啦。

image.png

继续打卡算法题,今天学习的是LeetCode第50题Pow(x, n),这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。

image.png

分析一波题目

实现幂函数pow(m,n)的功能,需要回顾下幂函数的定义,负指数幂等于对应正指数幂的倒

在Java中提供了库函数java.lang.Math#pow,但是本题是算法解题,肯定不适合使用库函数。那要如何求解呢?

初一看,我们肯定可以想到使用for循环,循环n次,不断的相乘得到结果。这样的肯定是可以求解的,有没有效率更高的呢?

以pow(3,4) 为例子,我们推算下朴素的计算过程

image.png

上面的图是从1次幂开始算的,一直算到指定次幂,如果我们使用分而治之的思考下,求3^4的时候,先算出3^2,那么3^4 = 3^2 * 3^2, 这样效率是不是提升了呢?

image.png

如果遇到n是奇数的情况,我们多需要乘一个m。

比如求3^5 = 3^2 * 3^2 * 3

本题解题技巧

1、需要理解幂函数的定义,特别是负指数幂的情况

2、分而治之思维,二分法思维,先求部分解,再求整体解。

编码解决

class Solution {
   
   
    public double myPow(double x, int n) {
   
   
    long N = n;
        return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
    }

    public double quickMul(double x, long N) {
   
   
        // 指数是奇数的情况 累加x
        double ans = 1.0;

        double x_contribute = x;

        while (N > 0) {
   
   
            //指数是奇数,额外计算一次底数
            if (N % 2 == 1) {
   
   
                // 如果 N 
                ans *= x_contribute;
            }
            // 每二分一次,就需要平方一次
            x_contribute *= x_contribute;
            // 二分一次
            N /= 2;
        }
        return ans;
    }
}

总结

本题考察的是分而治之的思想,先求解部分的解,整体的解可以通过部分的解得到,大大提高算法效率。

相关文章
|
12天前
|
算法 C++
Leetcode第50题(Pow(x,n))
这篇文章介绍了如何使用快速幂算法解决LeetCode第50题,即实现函数pow(x, n)来计算x的n次幂,并提供了C++的代码实现。
13 0
|
2月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
21 1
|
11月前
|
Java
Leetcode 372. Super Pow
真正的解法其实思路很简单,我随便举个例子就很容易理解了,假设要求(123^4567)%1337,只需要把这个幂式子分解成几个层次,然后把球模加到每一层中间就很容易计算出来了。
40 0
|
算法 安全 Swift
LeetCode - #50 Pow(x, n)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
算法 API
leetcode:50.Pow(x, n)
实现 pow(x, n),即计算 x 的 n 次幂函数。
45 0
LeetCode 372. Super Pow
你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。
72 0
LeetCode 372. Super Pow
LeetCode 50. Pow(x, n)
实现pow(x,n),即计算x的n次方
83 0
LeetCode 50. Pow(x, n)
|
存储 机器学习/深度学习 算法
LeetCode 49字母异位词分组&50pow(x,n)&51八皇后
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
128 0
LeetCode 49字母异位词分组&50pow(x,n)&51八皇后
|
算法 Java Python
ACM 选手图解 LeetCode Pow(x,n)
ACM 选手图解 LeetCode Pow(x,n)
ACM 选手图解 LeetCode Pow(x,n)