题目地址:https://leetcode-cn.com/problems/powx-n/
题目描述
实现 pow(x, n) ,即计算 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; //对注释代码进行化简 } };