(分治) 剑指 Offer 16. 数值的整数次方 ——【Leetcode每日一题】

news2024/10/7 20:29:01

❓剑指 Offer 16. 数值的整数次方

难度:中等

实现 pow(x, n) ,即计算 xn 次幂函数(即, x n x^n xn)。不得使用库函数,同时不需要考虑大数问题。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000

示例 2:

输入:x = 2.10000, n = 3
输出:9.26100

示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释: 2 − 2 = 1 / 2 2 = 1 / 4 = 0.25 2^{-2} = 1/2^2 = 1/4 = 0.25 22=1/22=1/4=0.25

提示

  • − 100.0 < x < 100.0 -100.0 < x < 100.0 100.0<x<100.0
  • − 2 31 < = n < = 2 31 − 1 -2^{31} <= n <= 2^{31}-1 231<=n<=2311
  • n 是一个整数
  • 要么 x 不为零,要么 n > 0
  • − 1 0 4 < = x n < = 1 0 4 -10^4 <= x^n <= 10^4 104<=xn<=104

注意:本题与 50. Pow(x, n) 相同。

💡思路:分治

最直观的解法是将 x 重复乘 n 次,x*x*x...*x,那么时间复杂度为 O ( N ) O(N) O(N)

因为乘法是可交换的,所以可以将上述操作拆开成两半 (x*x..*x)* (x*x..*x),两半的计算是一样的,因此只需要计算一次。而且对于新拆开的计算,又可以继续拆开。

这就是 分治思想,将原问题的规模拆成多个规模较小的子问题,最后子问题的解合并起来。

本题中子问题是 x n / 2 x^{n/2} xn/2,在将子问题合并时将子问题的解乘于自身相乘即可。

  • 但如果 n 不为偶数,那么拆成两半还会剩下一个 x,在将子问题合并时还需要需要多乘于一个 x
    x n = { x n / 2 ∗ x n / 2 n % 2 = 0 x ∗ ( x n / 2 ∗ x n / 2 ) n % 2 = 1 x^n=\left\{\begin{array}{rl}x^{n/2}*x^{n/2}&\quad n\%2=0\\x*(x^{n/2}*x^{n/2})&\quad n\%2=1\end{array}\right. xn={xn/2xn/2x(xn/2xn/2)n%2=0n%2=1

因为 ( x ∗ x ) n / 2 (x*x)^{n/2} (xx)n/2 可以通过递归求解,并且每次递归 n 都减小一半,因此整个算法的时间复杂度为 O ( l o g N ) O(logN) O(logN)

🍁代码:(C++、Java)

方法一:快速幂 + 递归
C++

class Solution {
private:
    double pow(double x, long n){
        if(n == 0) return 1;
        if(n == 1) return x;
        if(n % 2 == 0) return pow(x * x, n / 2);
        return x * pow(x * x, n / 2);
    }
public:
    double myPow(double x, int n) {
        long long N = n < 0 ? -(long long)n : n; 
        double ans = pow(x, N);
        return n < 0 ? 1 / ans : ans;
    }
};

Java

class Solution {
    private double pow(double x, long n){
        if(n == 0) return 1;
        if(n == 1) return x;
        if(n % 2 == 0) return pow(x * x, n / 2);
        return x * pow(x * x, n / 2);
    }
    public double myPow(double x, int n) {
        long N = n < 0 ? -(long)n : n; 
        double ans = pow(x, N);
        return n < 0 ? 1 / ans : ans;
    }
}

方法二:快速幂 + 迭代
C++

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

Java

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

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( l o g n ) O(logn) O(logn),即为对 n 进行二进制拆分的时间复杂度。
  • 空间复杂度 O ( 1 ) O(1) O(1);法一递归的函数调用会使用栈空间所以复杂度为 O ( l o g n ) O(logn) O(logn)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/886560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统安装Google Chrome

1.进入谷歌浏览器官网 Google Chrome - Download the Fast, Secure Browser from GoogleGet more done with the new Google Chrome. A more simple, secure, and faster web browser than ever, with Google’s smarts built-in. Download now.http://www.google.cn/intl/en_…

数学建模之“TOPSIS数学模型”原理和代码详解

一、简介 TOPSIS&#xff08;Technique for Order Preference by Similarity to Ideal Solution&#xff09;是一种多准则决策分析方法&#xff0c;用于解决多个候选方案之间的排序和选择问题。它基于一种数学模型&#xff0c;通过比较每个候选方案与理想解和负理想解之间的相…

图卷积网络:GNN 简介【01/4】

图片来源&#xff1a;作者 一、说明 图形神经网络 &#xff08;GNN&#xff09; 代表了深度学习领域最迷人、发展最迅速的架构之一。作为旨在处理结构化为图形的数据的深度学习模型&#xff0c;GNN 带来了非凡的多功能性和强大的学习能力。 在各种类型的GNN中&#xff0c;图卷…

使用Java服务器实现UDP消息的发送和接收(多线程)

目录 简介&#xff1a;1. 导入必要的库2. 创建服务器端代码3. 创建客户端代码4. 实现多线程处理5. 测试运行示例代码&#xff1a;函数说明服务器端代码说明&#xff1a;客户端代码说明&#xff1a; 总结&#xff1a; 简介&#xff1a; 在本篇博客中&#xff0c;我们将介绍如何…

Spring的三种异常处理方式

1.SpringMVC 异常的处理流程 异常分为编译时异常和运行时异常&#xff0c;编译时异常我们 try-cache 进行捕获&#xff0c;捕获后自行处理&#xff0c;而运行时异常是不 可预期的&#xff0c;就需要规范编码来避免&#xff0c;在SpringMVC 中&#xff0c;不管是编译异常还是运行…

激活函数总结(十):激活函数补充(Identity、LogSigmoid、Bent Identity)

激活函数总结&#xff08;十&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Identity激活函数2.2 LogSigmoid激活函数2.3 Bent Identity激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swish、…

【校招VIP】测试方案之等价类

考点介绍&#xff1a; 在校招中&#xff0c;等价类也是重要的考查点。等价类划分是一种典型的黑盒测试设计方法&#xff0c;使用该方法主要对测试子项进行测试规格分析&#xff0c;得到用例&#xff0c;而不用对系统内部处理进行深入了解&#xff0c;它也是目前测试设计过程中使…

Python Opencv实践 - 图像金字塔

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像上采样 #cv.pyrUp(src, dstNone, dstsizeNone, borderTypeNone) #参考资料&#xff1a;https://blo…

大势智慧软硬件技术答疑第九期

1.在使用模方修模大面积水面时&#xff0c;原模型没有瓦片的区域修补不了&#xff0c;软件也没有新增瓦片&#xff0c;怎么解决&#xff1f; 答&#xff1a;规则分块的数据&#xff0c;然后用新版本模方处理&#xff0c;设置好对应的空间框架。 2.重建大师密集匹配-纠正影像失败…

生产订单负数WIP处理方法(未发生费用准备金)

这个月财务在月结的时候反馈生产成本与制造费用不一致相差20多万&#xff0c; 先查看3611 制造相关的成本中心看上去过量与吸收不足均是0&#xff0c;都是ok的。 再查看一下啊 S_ALR_87013127 工单的投入产出平衡检查&#xff1a;订单结算后&#xff0c;实际成本借方实际成本贷…

[GitOps]微服务版本控制:使用ArgoCD 部署Grafana Loki

背景介绍 请回答&#xff1a;你们是如何保证线上部署的服务&#xff0c;从服务版本到参数配置&#xff0c;都是和测试通过的版本是一致的呢&#xff1f; 本文将介绍GitOps的基本原理以及ArgoCD的使用&#xff1a;ArgoCD部署Grafana Loki 到k8s集群。 本文项目地址&#xff1…

File Inclusion

File Inclusion 服务器执行PHP文件时&#xff0c;可以通过文件包含函数加载另一个文件中的PHP代码&#xff0c;并且当PHP来执行&#xff0c;这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时&#xff0c;您只更新一个包含…

Curson 编辑器

Curson 汉化与vacode一样 Curson 自带chat功能 1、快捷键ctrlk(代码中编辑) 2、快捷键ctrll 右侧打开窗口

最新MPAS跨尺度、可变分辨率模式实践技术应用及典型案例分析

目录 一、MPAS 模式基本信息 二、MPAS 代码获取及结构 三、MPAS 移植、编译及运行实践 四、MPAS 全球均匀网格的运行 五、MPAS 全球非均匀网格的运行 六、MPAS 区域网格的运行 七、MPAS 运行中的配置 八、MPAS结果处理、分析及可视化 九、了解 MPAS代码的结构、主要模…

攻防世界-web-fileclude

1. 题目描述 打开链接&#xff0c;可以看到如下代码&#xff1a; 代码意思很简单&#xff0c;让我们传递两个参数&#xff0c;一个file1&#xff0c;一个file2&#xff0c;如果file2的内容为hello ctf&#xff0c;那么就可以在代码中include file1 2. 思路分析 这道题显然是…

Android Stodio编译JNI项目,Cmake出错:Detecting C compiler ABI info - failed

在使用Android Stodio编译JNI项目时出现Cmake错误&#xff0c;报错如下&#xff1a; Execution failed for task :app:configureCMakeDebug[arm64-v8a]. > [CXX1429] error when building with cmake using C:\Users\Dell\AndroidStudioProjects\MyApplication2\app\src\ma…

BDA初级分析——认识SQL,认识基础语法

一、认识SQL SQL作为实用技能&#xff0c;热度高、应用广泛 在对数据分析人员的调查中SQL长期作为热度排名第-一的编程语言超过Python和R SQL&#xff1a;易学易用&#xff0c;高效强大的语言 SQL&#xff1a;Structured Query Language 结构化查询语言 SQL&#xff1a;易学…

svn 过滤文件

1. 右键点击&#xff0c;依次选择 TortoiseSVN -> Settings 2. 添加需要过滤的后缀/关键词【 *.iml *.idea *.jar *.class 】