leetcode power(x, n)
来源:互联网 发布:james blunt 知乎 声音 编辑:程序博客网 时间:2024/05/03 14:05
问题描述:
double power(double x, int n)的计算, n 可以是正也可以是负。
问题分析:
注意计算效率,避免重复计算。
伪代码:
下面代码不正确
double power(double x, int n){ if (n == 0) return 1; if (n > 0) { double tmp = power(x, n >> 1); double retVal = n & 1 ? tmp * tmp * x : tmp * tmp; return retVal; } else { double tmp = power(x, -1 * n); return (double)1.0 / tmp; }}
实例代码:
下面代码正确,易于理解,运行时间比较慢。对于上面问题的修正在于递归返回的地方,
n == 0 和 n == 1 是两种不同的情况不能进行合并。
在 n > 1的时候可以考虑采用迭代的方式来提高运行的效率。要做到O(lgn)复杂度的迭代
需要花费一番功夫。
double pow(double x, int n) { if (n == 0) return 1.0; if (n == 1) return x; if (n > 1) { double tmp = pow(x, n >> 1); double ret = n & 1 ? tmp * tmp * x : tmp * tmp; return ret; } else { double tmp = pow(x, -n - 1); /* 此处处理 INT_MIN 的情况 */ return (double)1.0 /( tmp * x); } }
迭代的版本:
1. n < 0 转换成为 n > 0 的情况进行处理。
2. -n - 1 在于处理INT_MIN的情况。
3. 迭代实现了O(lgn)复杂度的迭代。
4. cur1 记录正常的累乘结果
5. cur2 记录奇数的情况下(2 * k + 1)中那个 1 的累乘结果,与上一层的结果有关。
double pow(double x, int n) { if (n == 0) { return 1; } double cur1, cur2; for (cur1 = x, cur2 = 1; n > 1; cur1 *= cur1, n >>= 1) { if (n & 1) cur2 = cur2 * cur1; } if (n < 0) { return 1 / (x * pow(x, -n - 1)); } return cur1 * cur2; }
0 0
- leetcode power (x,n)
- leetcode power(x, n)
- GeeksForGeeks Power(x,n)
- power(x,n)
- 【小熊刷题】power of two, pow(x, n) <Leetcode 231, 50 Java>
- x = power(a , (n -1)>>1);
- LeetCode: Pow(x, n)
- LeetCode Pow(x,n)
- [Leetcode] Pow(x, n)
- LeetCode: Pow(x, n)
- Leetcode: Pow(x,n)
- [LeetCode] Pow(x, n)
- [Leetcode] Pow(x,n)
- 【leetcode】Pow(x, n)
- [LeetCode]Pow(x, n)
- [leetcode]Pow(x, n)
- LeetCode-Pow(x, n)
- LeetCode - Pow(x, n)
- C 语言程序设计实践 8.4 W.C之新店开张
- TI-Davinci开发系列之八x-loader工作流程分析
- LINK - JS: 使用event.preventDefault 阻止表单控件默认提交的行为
- C++基础知识---构造函数 & 析构函数 & 虚拟析构函数
- poj 1300 Door Man 无向图欧拉路径存在判断
- leetcode power(x, n)
- C++基础知识—关于默认构造函数的一切
- 一些练习——输出重复字符串
- OC类的继承和重写
- [003]Hidden CUGB
- C++基础知识--赋值操作符重载
- 百度计算广告学沙龙笔记
- CF 50C Happy Farm 5题解
- Hadoop的Python框架指南