[leet code] Pow(x, n)
来源:互联网 发布:北航网络教育官网 编辑:程序博客网 时间:2024/06/04 18:02
Question: Implement pow(x, n).
第二次做这道题仍然对以2为基数的解题方式感觉陌生. 直观做法, 超时. 于是只能考虑数值运算两大进阶解法:
1. 两分法 O(logn)
2. 2为基数: 将目标数字拆解成以2为基数的构成方式, 例如 123 = 2^6+2^5+2^4+2^3+2^1+2^0 O(logn)
对于第二种解法:
Step1: n为负数情况需要先求倒数, 检查越界
Step2: 对于x为负数情况先判断结果符号, 在求绝对值方便后续计算
Step3: x == Double.MIN_VALUE特殊情况处理, 数值运算都要注意对这一特殊情况进行处理 -Double.MIN_VALUE会越界.
Step4: 到这里才真正来到2为基数的解法. 基本思路是n每向右移动一位, 相当于x做了一次与自己相乘(x *= x) e.g. (x =3, n=8) =>(x=9, n=7) =>(x=81, n=3) =>(x=6561, n=1).
由于n相当于是每次/2于是O仍然是O(logn)
public double myPow(double x, int n) { if(x == 0) return 0; if(n == 0) return 1; if(n<0){ // case of result <1 if(x>=1/Double.MAX_VALUE || x <= -1/Double.MAX_VALUE){ x = 1/x; } else{ return Double.MAX_VALUE; } } n = Math.abs(n); boolean neg = false; if(x<0 && n%2 !=0){ neg = true; } double res = 1; if(x == Double.MIN_VALUE){ n -=1; res *= x; } x = Math.abs(x); while(n >0){ if((n & 1) != 0){ // check if overflow if(res>Double.MAX_VALUE/x){ return Double.MAX_VALUE; } res *= x; } x *= x; n = n>>1; } if(neg) return -res; return res; }
0 0
- [leet code] Pow(x, n)
- [leet code] Partition List Pow(x, n)
- CODE 83: Pow(x, n)
- leetcode 日经贴,Cpp code -Pow(x, n)
- Pow(x, n) / Super Pow
- [leet code] N-Queens & II
- 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)
- Pow(x, n)
- 【leetcode】Pow(x, n)
- Pow(x, n)
- 求 pow(x, n)
- [LeetCode]Pow(x, n)
- Handler消息机制(深入源码分析)
- 设计模式系列11---快速拷贝的原型模型
- zookeeper官档教程一(zookeeper数据模型)
- Android 递归实现assets拷贝到sd卡
- ios sqlite数据库的简单应用
- [leet code] Pow(x, n)
- C++ http请求
- svn的理解与应用
- 傅里叶:有关FFT,DFT与蝴蝶操作(转 重要!!!!重要!!!!真的很重要!!!!)
- HDU 2062 Subset sequence
- Ubuntu环境搭建之输入法的安装
- Android下u盘挂载相关文章
- android基础之屏幕适配基础 sdk版本支持基础
- 算法导论考试题目