LeetCode-50-Pow(x, n)
创始人
2024-03-08 11:22:22
0

在这里插入图片描述

1、递归

我们最简单的思路就是使用递归,每次就让x乘上Pow(x, n-1)的值。但是这样做的缺点在于递归时间过长会导致超时,因此我们可以使用快速幂进行优化。

快速幂的思想在于我们在求x的N次幂时,不使用x∗xN−1x*x^{N-1}x∗xN−1,而是使用xN/2∗xN/2x^{N/2}*x^{N/2}xN/2∗xN/2从而减少递归次数至O(logN)O(logN)O(logN)。

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

2、迭代

我们可以将xnx^nxn拆成多个x2kx^{2^k}x2k项之和,例如x77=x1∗x4∗x8∗x64x^77=x^1*x^4*x^8*x^{64}x77=x1∗x4∗x8∗x64,而77的二进制表示恰好为100110110011011001101,其中二进制上每个1的位置表示了有哪些x2kx^{2^k}x2k需要相加,我们可以基于这一特点来设计迭代过程。

class Solution {
public:double quickMul(double x, long long N) {double ans = 1.0;// 贡献的初始值为 xdouble x_contribute = x;// 在对 N 进行二进制拆分的同时计算答案while (N > 0) {if (N % 2 == 1) {// 如果 N 二进制表示的最低位为 1,那么需要计入贡献ans *= x_contribute;}// 将贡献不断地平方x_contribute *= x_contribute;// 舍弃 N 二进制表示的最低位,这样我们每次只要判断最低位即可N /= 2;}return ans;}double myPow(double x, int n) {long long N = n;return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);}
};

相关内容

热门资讯

新华社消息|三部重要法律案将提... 记者:魏冠宇、赵博 编导:季晓庄 新华社国内部 新华社音视频部 联合制作
北京公安机关十年共审查违法犯罪... 光明网记者 陈畅 孙满桃 创新推行“48小时速裁+不起诉案件快速办理+取保候审案件集中快审”三种模式...
河套合作区深圳园区条例获通过 12月26日上午,深圳市七届人大常委会第四十二次会议在举行第二次全体会议后闭幕。会议表决通过《深圳经...
依法严厉打击节日市场食品领域突... 2026年元旦、春节将至,节令食品和假期餐饮进入消费高峰期。为切实保障群众餐桌安全,公安部环境资源和...
连宿连淮高速开通 连云港市区高... 12月25日,连云港市召开“连宿”“连淮”高速公路建设工程开通运营暨市区部分高速公路路段差异化收费政...
四部门打出就业创业政策组合拳 ... 昨天,财政部等四部门出台指导意见,要求进一步发挥政府性融资担保体系增信分险作用,引导更多金融资源精准...
三部重要法律案将提请2026年... 新华社北京12月27日电(记者冯家顺)十四届全国人大常委会第十九次会议12月27日表决通过相关议案,...
演员保剑锋发布律师声明 12月26日,@保剑锋工作室 账号发布声明: 近期,部分网络用户在我方发布声明后仍持续、恶意散播关于...
一次性信用修复政策哪些情况能享... 极目新闻记者 刘闪 实习生 刘佳妮 12月22日,中国人民银行发布《关于实施一次性信用修复政策有关安...