关闭

Leetcode(50):Pow(x, n)

标签: leetcodeC语言
300人阅读 评论(0) 收藏 举报
分类:

我们先考虑n是非负数的情况:


方法一:迭代法

double pow(double x, int n)
{
    int i;
    double sum = 1;
    for (i = 0; i < n; i++)
        sum *= x;
    return sum;
}

主要操作为乘法运算。

T(n) = n;

时间复杂度为O(n);


方法二:递归一

double pow(double x, int n)
{
    if (n == 0)
        return 1;
    if (n == 1)
        return x;
    else
        return  pow(x, n-1) * x;
}

主要操作为乘法运算。

T(n) = T(n-1) + 1;

T(1) = 0;

T(n) = n-1;

时间复杂度为O(n);


方法三:递归二(使用二分法)

double pow(double x, int n)
{
    if (n == 0)
        return 1;
    if (n == 1)
        return x;
    if (n % 2)
        return pow(x, n-1) * x; //也可以使用return pow(x, (n-1)/2) * pow(x, (n-1)/2) * x; 结果时间复杂度相同。
    else
        return pow(x, n/2) * pow(x, n/2);
}
主要操作为乘法运算。

先计算n为偶数的时间复杂度:

T(n)= 2T(n/2) + 1;

T(1) = 0;

T(2^k) = 2*T(2^(k-1)) + 1 = 2*(2*T(2^(k-2) + 1)) + 1 = 2^2 * T(2^(k-2)) + 2^1 + 1;

迭代可求得,T(2^k)= 2^k * T(2^0) + 2^(k-1) + 1;

T(n) = n/2 + 1;

时间复杂度为O(n);

n位奇数时的时间复杂度为:

T(n) = T(n-1) + 1;

因为n为奇数,那么n-1一定为偶数,所以T(n)= (n-1)/2 + 2 = n + 3/2;

时间复杂度为O(n);

所以,总的时间复杂度为O(n);


方法四:(递归,二分法,优化)

double pow(double x, int n)
{
    if (n == 0) return 1;
    if (n == 1) return x;
    double v = pow(x, n/2);
    if (n % 2)
        return v * v *x;
    else
        return v * v;
}

基本运算为乘法运算。

n为偶数时:T(n) = T(n/2) + 1;

n为奇数时:T(n) = T(n/2) + 2;

T(1) = 0;

使用上面类似的分析方法可得出时间复杂度为O(logn);


方法五:进一步优化

double pow(double x, int n)
{
    if (n == 0) return 1;
    if (n == 1) return x;
    if (n % 2) 
        return pow(x*x, n/2) * x;
    else
        return pow(x*x, n/2);
}
虽然这个算法的时间复杂度仍然是O(logn)。但是相对于方法三,速度会加快。


接着,考虑n为负数的情况

double myPow(double x, int n)
{
    if (n < 0)
        return 1.0/pow(x, -n);
    else
        return pow(x, n);
}
经过测试,除了方法一时间超时外,其他的都可以Accept。可见leetcode对时间复杂度的要求不是非常严格。


要考虑 0次方的问题

0的0次方有争议, 我们返回0

0的负数次方非法

0
0
查看评论

(Java)LeetCode-50. Pow(x, n)

Implement pow(x, n). 这道题最慢时间复杂度也是O(n),快一些的是O(logn),主要是将n考虑为二进制的形式,某一位是1的话,就乘上相应的次方数即可。代码如下: public class Solution { public double...
  • u012848330
  • u012848330
  • 2016-10-01 17:44
  • 255

LeetCode(50) Pow(x,n)

题目Implement pow(x, n).Show Tags Show Similar Problems分析一个不利用标准幂次函数的,求幂算法实现。参考了一个很好的解析博客:Pow(x,n)问题详解AC代码class Solution { public: double myPow(dou...
  • fly_yr
  • fly_yr
  • 2015-09-01 20:57
  • 2326

[LeetCode-50] Pow(x, n)(数值的整数次方)

Implement pow(x, n). Subscribe to see which companies asked this question 【方法一】: 1)最直观容易想到的方法就是用递归方法求n个x的乘积,注意考虑n的正负号,时间复杂度为O(n) double p...
  • xy010902100449
  • xy010902100449
  • 2015-10-29 20:19
  • 2658

leetcode 50. Pow(x, n)-细说边界问题

原题链接:50. Pow(x, n) 【思路-Java】递归实现 采用递归实现,那么本题的终止条件是 n == 0 和 n == 1。这里不采用下面的做法: public class Solution { public double myPow(double x, int n) { ...
  • happyaaaaaaaaaaa
  • happyaaaaaaaaaaa
  • 2016-06-13 11:26
  • 2483

[leetcode] 【分治法】 50. Pow(x, n)

Implement pow(x, n). 题意 实现幂函数。 题解 使用分治法求解。 分:将n分成n/2  直到n=0时,返回1; 治:对n为偶数,返回两数相乘的结果,奇数再乘多一个x;  class Solution { public: do...
  • u014654002
  • u014654002
  • 2016-06-21 00:37
  • 384

LeetCode 50 — Pow(x, n)(C++ Java Python)

题目:http://oj.leetcode.com/problems/powx-n/ Implement pow(x, n). 题目翻译:         实现pow(x, n)。 分析:   ...
  • dragon_dream
  • dragon_dream
  • 2014-03-21 11:04
  • 2882

LeetCode50——Pow(x,n)

LeetCode50——Pow(x,n) 题意: 实现 math.h里面的pow函数。 好代码如下: class Solution { public: double myPow(double x, int n) { return pow(x,(double)n); } }; 好的此题完结--...
  • zhangxiao93
  • zhangxiao93
  • 2015-10-23 09:52
  • 740

LeetCode问题 pow(x,n)

实现浮点类型的幂运算,函数原型为: double pow(double x, int n) 下面介绍一下解决该问题的几种方法以及要注意的地方: 1)最直观容易想到的方法就是用递归方法求n个x的乘积,注意考虑n的正负号,时间复杂度为O(n) double pow(double x, int n) {...
  • fengbingyang
  • fengbingyang
  • 2013-10-02 15:44
  • 13753

50. Pow(x,n) Leetcode Python

Implement pow(x, n). 这题可以用recursive 和iterate 的解法。 解的时候要注意负数。 首先是 recursive的解: class Solution: # @param x, a float # @param n, a integer ...
  • hyperbolechi
  • hyperbolechi
  • 2015-02-04 00:19
  • 1383

LeetCode | Pow(x, n)

题目: Implement pow(x, n). 思路: 最简单的办法是根据n进行循环并计算乘积,但是这样的时间开销比较大。最好能够再减少循环次数,例如n4可以表示成(n2)2。将n表示成二进制的格式便能够轻松知道如何减少循环次数。 除此以外,考虑特殊情况,例如: 1)指数为1 2)指数...
  • lanxu_yy
  • lanxu_yy
  • 2013-09-14 16:25
  • 4290
    个人资料
    • 访问:31540次
    • 积分:921
    • 等级:
    • 排名:千里之外
    • 原创:61篇
    • 转载:7篇
    • 译文:2篇
    • 评论:4条
    最新评论