50:Pow(x,n)(C++)

题目地址:https://leetcode-cn.com/problems/powx-n/

题目描述

实现 pow(xn) ,即计算 x 的 n 次幂函数

题目示例

示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:

-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

解题思路

思路1:暴力求解。求解思路为循环累乘,不过需要注意的是n的正负,该方法求解过程存在超时的问题,时间复杂度O(n)。

思路2:使用折半遍历进行暴力优化。

思路3:分治+回溯。可以理解为将Pow(x,n)的问题分解为子问题Pow(x,n/2),时间复杂度为O(logn),因为每次都减半。

程序源码

思路1

class Solution {
public:
    double myPow(double x, int n) {
        double res = 1.0;
        long num = n;
        if(n < 0)
        {
            x = 1 / x;
            num = -num;
        }
        for(int i = 0; i < num; ++i)
        {
            res *= x;
        }
        return res;
    }
};

思路2

class Solution {
public:
    double myPow(double x, int n) {
        double res = 1.0;
        long num = n;
        if(n < 0)
        {
            x = 1 / x;
            num = -num;
        }
        for(int i = num; i != 0; i /= 2)
        {
            if(i % 2 != 0)
            {
                res *= x;
            }
            x *= x;
        }
        return res;
    }
};

思路3

class Solution {
public:
    double myPow(double x, int n) {
        long num = n;
        if(n < 0)
        {
            x = 1 / x;
            num = -num;
        }
        return fast_pow(x, num);
    }
    double fast_pow(double x, long n)
    {
        if(n == 0) return 1.0;
        double half = fast_pow(x, n / 2);
        /*if(n % 2 == 0) return half * half;
        else
            return half * half * x;*/
        return n % 2 == 0? half * half : half * half * x; //对注释代码进行化简
    }
};
----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
原文地址:https://www.cnblogs.com/wzw0625/p/13543149.html