LeetCode第50题Pow(x, n)

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

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

分析一波题目

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

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

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

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

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

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

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

本题解题技巧

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

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

编码解决

java 复制代码
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;
    }
}

总结

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

相关推荐
青 春 记 忆5 分钟前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
ZGG00314 分钟前
线程池详解:从 7 大参数到生产避坑
java·数据库·后端
刀法如飞1 小时前
《理解道德经》简版第5章:天地不仁,以万物为刍狗
面试·机器人
阳明山水1 小时前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构
桐盛科技1 小时前
拒绝“漂绿”风险:基于边缘计算的碳排放数据清洗算法与实时校验逻辑
人工智能·算法·边缘计算
wuyk5551 小时前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
geovindu1 小时前
CSharp: Wordcloud
开发语言·后端·c#·.net·.netcore·词云
Tongzhi20261 小时前
通芝科技考勤软件三大发展趋势:AI大模型、无感识别与数据底座
大数据·科技·算法·爬山算法
eBest数字化转型方案2 小时前
Route Optimization for FMCG:多目标排线算法的工程实现
大数据·人工智能·算法
geovindu2 小时前
CSharp: Command Pattern
开发语言·后端·c#·.net·.netcore·命令模式·行为模式