题目:实现 pow(x, n) ,即计算 x
的整数 n
次幂函数(即,x^n
)
示例 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/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0
-2^31 <= n <= 2^31-1
-10^4 <= x^n <= 10^4
思路一:实现pow(x,n),可以直接return x**n,在leetcode上可以提交通过。
思路二:使用折半计算,每次把n缩小一半,这样n最终会缩小到0,任何数的0次方都为1,这时候我们再往回乘,如果此时n是偶数,直接把上次递归得到的值算个平方返回即可,如果是奇数,则还需要乘上个x的值。还有一点需要引起我们的注意的是n有可能为负数,对于n是负数的情况,我们可以先用其绝对值计算出一个结果再取其倒数即可。我们让i初始化为n,然后看i是否是2的倍数,是的话x乘以自己,否则res乘以x,i每次循环缩小一半,直到为0停止循环。最后看n的正负,如果为负,返回其倒数。
思路三:通过动态规划或者递归进行挨个计算乘积值,最后再返回找到的目标值,再通过if()的条件,除去一些复杂案例。
思路二、完整代码:
class Solution {
public double myPow(double x, int n) {
double res = 1.0;
for(int i = n; i != 0; i /= 2){
if(i % 2 != 0){
res *= x;
}
x *= x;
}
return n < 0 ? 1 / res : res;
}
}
思路三:先是定义好动态规划的数组,然后for()寻找目标值。
vector<double>dp;
dp.resize(n+1);
dp[0]=1.0;
for(int i=1;i<n+1;i++)
{
dp[i]=dp[i-1]*x;
}
这是保证n为正数的时候,如果n为负数:
if(ret==false) //ret是判断n是否为0的bool类型
{
dp[n]=1/dp[n];
}
但是看到n的取值范围最大是INT_MAX.所以减少运算量,当x=1.00001,n大于100000时,已经小的微乎其微了,所以都直接按照n=100000处理。当然n为负数时也一样,这里就是要判断一下n是否为负数,要不然出现符号相反的问题。
思路三、完整代码:
class Solution {
public:
double myPow(double x, int n) {
vector<double>dp;
bool ret=false;
int target=1;
if(abs(n)%2==1)
{
target=-1; //奇数
}
if(n>=0)
{
if(n>1000000)
{
n=1000000;
if(target==-1)
{
n=1000001;
}
}
ret=true;
}
if(n<0)
{
if(n<-2000000)
{
n=-2000000;
if(target==-1)
{
n=-2000001;
}
}
n=-n;
}
dp.resize(n+1);
dp[0]=1.0;
for(int i=1;i<n+1;i++)
{
dp[i]=dp[i-1]*x;
}
if(ret==false)
{
dp[n]=1/dp[n];
}
return dp[n];
}
};
三种思路就是这样了;感觉各位读者的阅读!