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

❓剑指 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.hqwc.cn/news/69698.html

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

相关文章

代码随想录算法训练营第58天|动态规划part15|392.判断子序列、115.不同的子序列

代码随想录算法训练营第58天&#xff5c;动态规划part15&#xff5c;392.判断子序列、115.不同的子序列 392.判断子序列 392.判断子序列 思路&#xff1a; &#xff08;这道题也可以用双指针的思路来实现&#xff0c;时间复杂度也是O(n)&#xff09; 这道题应该算是编辑距…

C++ 泛型编程:函数模板

文章目录 前言一、什么是泛型编程二、函数模板三、函数模板的使用四、多参数函数模板五&#xff0c;示例代码&#xff1a;总结 前言 当需要编写通用的代码以处理不同类型的数据时&#xff0c;C 中的函数模板是一个很有用的工具。函数模板允许我们编写一个通用的函数定义&#…

前端性能优化——包体积压缩插件,打包速度提升插件,提升浏览器响应的速率模式

前端代码优化 –其他的优化可以具体在网上搜索 压缩项目打包后的体积大小、提升打包速度&#xff0c;是前端性能优化中非常重要的环节&#xff0c;结合工作中的实践总结&#xff0c;梳理出一些 常规且有效 的性能优化建议 ue 项目可以通过添加–report命令&#xff1a; "…

Python tkinter Notebook标签添加关闭按钮元素,及左侧添加存储状态提示图标案例,类似Notepad++页面

效果图展示 粉色框是当前页面&#xff0c;橙色框是鼠标经过&#xff0c;红色框是按下按钮&#xff0c;灰色按钮是其他页面的效果&#xff1b; 存储标识可以用来识别页面是否存储&#xff1a;例如当前页面已经保存用蓝色&#xff0c;未保存用红色&#xff0c;其他页面已经保存用…

24届近3年上海电力大学自动化考研院校分析

今天给大家带来的是上海电力大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、上海电力大学 学校简介 上海电力大学&#xff08;Shanghai University of Electric Power&#xff09;&#xff0c;位于上海市&#xff0c;是中央与上海市共建、以上海市管理为主的全日…

创新引领城市进化:人工智能和大数据塑造智慧城市新面貌

人工智能和大数据等前沿技术正以惊人的速度融入智慧城市的方方面面&#xff0c;为城市的发展注入了强大的智慧和活力。这些技术的应用不仅令城市管理更高效、居民生活更便捷&#xff0c;还为可持续发展和创新奠定了坚实的基础。 在智慧城市中&#xff0c;人工智能技术正成为城市…

【C++学习手札】一文带你初识运算符重载

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f340;本文前置知识&#xff1a; C类 ♈️今日夜电波&#xff1a;クリームソーダとシャンデリア—Edo_Ame江户糖 1:20 ━━━━━━️&#x1f49f;──────── 3:40 …

【CSS】背景图定位问题适配不同机型

需求 如图, 实现一个带有飘带的渐变背景 其中头像必须显示飘带凹下去那里 , 需要适配不同的机型, 一不下心容易错位 实现 因为飘带背景是版本迭代中更新的, 所以飘带和渐变背景实则两个div 飘带切图如下 , 圆形部分需要契合头像 <view class"box-bg"><…

梅赛德斯-奔驰将成为首家集成ChatGPT的汽车制造商

ChatGPT的受欢迎程度毋庸置疑。OpenAI这个基于人工智能的工具&#xff0c;每天能够吸引无数用户使用&#xff0c;已成为当下很受欢迎的技术热点。因此&#xff0c;有许多公司都在想方设法利用ChatGPT来提高产品吸引力&#xff0c;卖点以及性能。在汽车领域&#xff0c;梅赛德斯…

AI芯片暴涨!沙特、阿联酋等国加入抢货行列 | 百能云芯

在全球半导体市场中&#xff0c;一场异常激烈的竞争正在酝酿&#xff0c;引发了各国科技巨头和企业的争相购买英伟达AI芯片的浪潮。除了美国科技大厂之外&#xff0c;包括百度、字节跳动、阿里等中国企业在内&#xff0c;沙特阿拉伯与阿拉伯联合酋长国也纷纷加入了这场角逐&…

使用Kaptcha生成验证码

说明&#xff1a;验证码&#xff0c;是登录流程中必不可少的一环&#xff0c;一般企业级的系统&#xff0c;使用都是专门制作验证码、审核校验的第三方SDK&#xff08;如极验&#xff09;。本文介绍&#xff0c;使用谷歌提供的Kaptcha技术&#xff0c;制作一个简单的验证码。 …

一.RocketMQ概念

RocketMQ概念 1.概念2.应用场景3.MQ的优点和缺点4.常见MQ对比 1.概念 MQ(Message Queue)&#xff0c;是一种提供消息队列服务的中间件&#xff0c;也称为消息中间件&#xff0c;是一套提供了消息生产、存储、消费全过程API的软件系统。 RocketMQ是阿里巴巴2016年MQ中间件&…