leetcode 50. Pow(x, n)

 

目录

函数定义:

2. 处理特殊情况:

3. 处理负指数:

4. 处理偶数指数:

5. 处理奇数指数:

时间复杂度

空间复杂度


class Solution {
public:double myPow(double x, int n) {if(n == 0){return 1;}if(n == 1) return x;if(n < 0){if(n == -2147483648){return 1 / (myPow(x,-(n+1))*x);}return 1 / myPow(x,-n);}if(n % 2 == 0){double temp = myPow(x,n / 2);return temp * temp;}else{double temp = myPow(x,n / 2);return temp * temp * x;}}
};
  1. 函数定义

 

cpp复制代码

double myPow(double x, int n)

这定义了一个名为 myPow 的函数,它接受一个双精度浮点数 x 和一个整数 n 作为参数,并返回一个双精度浮点数。


2. 处理特殊情况

 

cpp复制代码

if(n == 0)
{
return 1;
}
if(n == 1) return x;

如果 n 是0,任何数的0次方都是1,所以直接返回1。如果 n 是1,任何数的1次方就是其本身,所以直接返回 x


3. 处理负指数

 

cpp复制代码

if(n < 0)
{
if(n == -2147483648)
{
return 1 / (myPow(x,-(n+1))*x);
}
return 1 / myPow(x,-n);
}

如果 n 是负数,x^n 可以表示为 1 / (x^(-n))。但这里有一个特殊情况需要注意,即当 n 是 -2147483648 时(这是32位整数能表示的最小值)。在这种情况下,直接计算 -n 可能会导致整数溢出。因此,代码使用了 -(n+1) 来避免这个问题。


4. 处理偶数指数

 

cpp复制代码

if(n % 2 == 0)
{
double temp = myPow(x,n / 2);
return temp * temp;
}

如果 n 是偶数,那么 x^n 可以写成 (x^(n/2))^2。这里通过递归调用 myPow(x, n/2) 来计算 x^(n/2),然后将其平方。


5. 处理奇数指数

 

cpp复制代码

else
{
double temp = myPow(x,n / 2);
return temp * temp * x;
}

如果 n 是奇数,那么 x^n 可以写成 x * (x^((n-1)/2))^2。同样地,这里通过递归调用 myPow(x, (n-1)/2) 来计算 x^((n-1)/2),然后将其平方并乘以 x

这个实现使用了递归和分解的方法,将大的指数分解为更小的部分,从而简化了计算。此外,它还特别处理了负指数和整数溢出的情况,确保了代码的健壮性。

时间复杂度

  1. 基本情况
    • 如果 n 是0或1,函数直接返回,时间复杂度为 O(1)。
    • 如果 n 是负数,并且等于 -2147483648,函数执行两次递归调用和一个乘法,时间复杂度为 O(log(|n|))。
  2. 递归情况
    • 对于偶数 n,函数执行一次递归调用和一次乘法,时间复杂度为 O(log(|n|))。
    • 对于奇数 n,函数执行一次递归调用和两次乘法,时间复杂度也是 O(log(|n|))。

综合所有情况,无论 n 的值是多少(正数、负数、大数、小数),myPow 函数的时间复杂度都是 O(log(|n|))。这是因为每次递归调用都将问题规模减半(对于偶数 n)或减小到接近一半(对于奇数 n),直到问题规模变为1。

空间复杂度

空间复杂度主要由递归调用栈的深度决定。在最坏的情况下(当 n 是负数且接近 -2147483648 时),递归深度可能接近 |n| 的绝对值。因此,空间复杂度在最坏情况下是 O(|n|)。然而,在平均情况下,空间复杂度仍然是 O(log(|n|)),因为递归树是平衡的。

总结:

  • 时间复杂度:O(log(|n|))
  • 空间复杂度:在最坏情况下是 O(|n|),但在平均情况下是 O(log(|n|))。

这个实现是非常高效的,因为它利用了指数的性质来减少必要的计算量,并且递归调用栈的深度也相对较小。

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

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

相关文章

C#设计模式---工厂方法模式

24种常用设计模式 创建型模式&#xff1a;抽象工厂、生成器、工厂方法、原型、单例&#xff1b; 结构型模式&#xff1a;适配器、桥接、组合、装饰、外观、享元、代理&#xff1b; 行为模式&#xff1a;责任链、命令、迭代器、中介者、备忘录、观察者、状态、策略、模板方法…

二分算法(c++版)

二分的本质是什么&#xff1f; 很多人会认为单调性是二分的本质&#xff0c;但其实其本质并非单调性&#xff0c;只是说&#xff0c;有单调性的可以进行二分&#xff0c;但是有些题目没有单调性我们也可以进行二分。其本质其实是一个边界问题&#xff0c;给定一个条件&#xf…

golang的map是如何扩容的【重点】

具体内容参考链接 https://zhuanlan.zhihu.com/p/616979764 Golang的map就是使用哈希表作为底层实现&#xff0c;map 实际上就是一个指针&#xff0c;指向hmap结构体。 Go 语言中的 map 在扩容时&#xff0c;会重新分配更大的内存空间&#xff0c;并将原有的键值对重新哈希到新…

【机器学习基础】一元线性回归(适合初学者的保姆级文章)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a; 【机器学习基础】机器学习入门&#xff08;1&#xff09; 【机器学习基…

python 函数-03-参数

入参不需要指定类型&#xff0c;只需要参数名称即可 【特殊性&#xff0c;区别于java c#等】传参两种方式&#xff1a; 位置参数 如 cube_volume(1, 2, 3) 关键字参数 如 cube_volume(width 1, height 2, length 3)参数为可变对象&#xff0c;如当参数为列表时&#xff0c;在…

趣学贝叶斯统计:条件概率(1)

前言 到目前为止&#xff0c;我们只讨论了独立事件的概率。当一个事件的结果不影响另一个事件的结果时&#xff0c;这两个事件就是独立事件。例如&#xff0c;掷硬币时出现正面并不影响掷骰子是否会掷出6点。计算独立事件的概率要比计算非独立事件的概率容易得多&#xff0c;但…

ES6 字符串面试题

如何判断字符串 “Hello, World!” 是否以 “Hello” 开头&#xff1f; 答案&#xff1a; const str "Hello, World!"; const startsWithHello str.startsWith("Hello"); console.log(startsWithHello); // 输出 true如何判断字符串 “Hello, World!” …

C 标准库 - <stdlib.h>

简介 <stdlib.h> 头文件定义了四个变量类型、一些宏和各种通用工具函数。 库变量 下面是头文件 stdlib.h 中定义的变量类型&#xff1a; 序号变量 & 描述1size_t2wchar_t3div_t4ldiv_t 库宏 下面是头文件 stdlib.h 中定义的宏&#xff1a; 序号宏 & 描述1…

conntrack-tools 内核依赖,

1 内核依赖 You require a Linux kernel version > 2.6.18. Connection Tracking System. CONFIG_NF_CONNTRACKm CONFIG_NF_CONNTRACK_IPV4m CONFIG_NF_CONNTRACK_IPV6m (if your setup supports IPv6) nfnetlink: the generic messaging interface for Netfilter. CONF…

【深度学习:标记数据】为医生标记数据缓解疼痛

【深度学习&#xff1a;标记数据】为医生标记数据缓解疼痛 问题实验结果结论 我开始在物理学方面进行学术研究&#xff0c;但在第一年就退学了&#xff08;抱歉&#xff0c;休学了&#xff09;我的博士学位&#xff0c;并在定量金融领域做了很长一段时间。因此&#xff0c;在我…

宝塔面板安装了mysql5.7和phpMyadmin,但是访问phpMyadmin时提示502 Bad Gateway

操作流程截图如下&#xff1a; 原因是没有选择php版本 选择php版本 下一页找到phpMyAdmin&#xff0c;选择设置 目前只有纯净态&#xff0c;说明没有php环境&#xff0c;前去安装php环境 点击安装&#xff0c;选择版本&#xff0c;这里选择的是7.4版本&#xff0c;编译安…

创建者模式(Builder Pattern):构造复杂对象的通用解决方案

文章目录 **一、技术背景与应用场景****为何使用创建者模式&#xff1f;****典型应用场景包括但不限于&#xff1a;** **二、创建者模式定义与结构****三、使用步骤举例**四、优缺点分析总结 一、技术背景与应用场景 创建者模式是一种对象创建型设计模式&#xff0c;它通过将复…

Apache Doris 发展历程、技术特性及云原生时代的未来规划

文章目录 每日一句正能量前言作者介绍Apache Doris 特性极简架构高效自运维高并发场景支持MPP 执行引擎明细与聚合模型的统一便捷数据接入Apache Doris 极速 1.0 时代极速列式内存布局向量化的计算框架Cache 亲和度虚函数调用SIMD 指令集 稳定多源基于云原生向量数据库Milvus 的…

基于ZYNQ的PCIE高速数据采集卡的设计(三)硬件设计

采集卡硬件设计 3.1 引言 采集卡的硬件设计是实现采集功能的基础&#xff0c;良好的硬件设计可以使采集功能更容 易实现&#xff0c;方便软件开发。本章基于第二章的硬件设计方案来详细介绍采集卡硬件设计。 包括载卡和子卡的芯片的选型、配置和具体电路的设计。载卡和子卡…

蓝桥杯《修剪灌木》

题目描述 爱丽丝要完成一项修剪灌木的工作。有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌木&#xff0c;让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始&#xff0c;每天向右修剪一棵灌木。当修剪了最右侧的灌木后&#xff0c;她会…

【程序员必备技能】Git入门

目录 &#x1f308;前言&#x1f308; &#x1f4c1; Git的概念 &#x1f4c2; 版本控制 &#x1f4c2; 集中式 和 分布式 ​ &#x1f4c1; 创建和配置本地仓库 &#x1f4c1; 理解工作区&#xff0c;暂存区&#xff0c;版本库 &#x1f4c1; Git的基本操作 &#x1f4c2;…

JMeter实现接口自动化测试

一、JMETER的环境搭建 参考&#xff1a;https://www.cnblogs.com/qmfsun/p/4902534.html 二、JMETER的汉化 临时汉化方法&#xff1a;打开jmeter&#xff0c;options-->choose language-->选择语言 可以根据自己的需要选择简体中文或者繁体中文&#xff0c;如图&#xf…

字符串(算法竞赛)--字典树Trie与最大异或对

1、B站视频链接&#xff1a;F06 字典树(Trie)_哔哩哔哩_bilibili 题目链接&#xff1a;【模板】字典树 - 洛谷 #include <bits/stdc.h> using namespace std; const int N100010; int n; char s[N]; int ch[N][26];//ch[0][2]1表示0号节点通过c边走到了节点1 int cnt[…

【电子通识】认识FMEA(失效模式和影响分析)

FMEA是Failure Mode and Effect Analysis的英文缩写&#xff0c;中文名称为失效模式和影响分析。主要应用于航空航天、食品、汽车和核电等行业。 FMEA讨论的是事先策划以及执行措施&#xff0c;预防问题的发生或控制问题的发展&#xff0c;降低设计和过程的风险。由于问题还没…

基于java Springboot实现教务管理系统

基于java Springboot实现教务管理系统《视频版-建议收藏》 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文…