“`java
考虑边界问题,int的最小值转成正数会超过最大值的范围,越界
class Solution {
public double myPow(double x, int n) {
double res = 1d;
if (x == 0) {
return x;
}
if (n == -Integer.MAX_VALUE – 1) {
x = 1/(x*x);
n = -(n/2);
}
if (n < 0) {
x = 1/x;
n = -n;
}
while (n != 0) {
if ((n & 1) == 1) {
res = res * x;
}
n = n >> 1;
x = x * x;
}
return res;
}
}
class Solution {
public double myPow(double x, int n) {
double sum=1;
long N = n;
if(n<0){
N = -N;
x = 1/x;
}
while(N>0){
if((N&1)1){
sum = sumx;
}
x = xx;
N=N>>1;
}
return sum;
}
}
嘎嘎
class Solution {
public double myPow(double x, int n) {
double ans = 1.0, base = x;
long N = n; // 不可直接long N = n > 0 ? -n : n;
N = n < 0 ? -N : N;
while (N > 0) {
if ((N & 1) == 1) {
ans *= base;
}
base *= base;
N = N >> 1;
}
return n > 0 ? ans : 1.0 / ans;
}
}
class Solution {
public double myPow(double x, int n) {
double res = 1;
long y = n;
if(n < 0){
x = 1 / x;
y = -y;
}
while(y > 0){
if(y % 2 == 1)res = res * x;
x = x * x;
y /= 2;
}
return res;
}
}
class Solution {
public double myPow(double x, int n) {
double res = 1;
long y = n;
if (n < 0) {
y = -y;
x = 1/x;
}
while (y > 0) {
if (y % 2 == 1) res = res * x;
x = x * x;
y = y / 2;
}
return res;
}
}
class Solution {
public:
double mylongPow(double x, long long n){
double xproduct = x, ans = 1;
while(n){
if(n & 1)
ans *= xproduct;
n = n >> 1;
xproduct *= xproduct;
}
return ans;
}
double myPow(double x, int n) {
long long N = n;
return N >= 0 ? mylongPow(x, N) : 1.0 / mylongPow(x, -N);
}
};
将 n 以二进制位表示,如果第 k 位为1,则最终次方结果应乘上 x^(2^k),因为是 int 类型的数,从补码角度来看如果从右往左第 32 位为 1,结果应乘上 x^(-2^32)
这样不行,因为会有 inf 的问题
把负数转换成正数计算,单独处理-2^31的问题,将其结果直接设置为 0
看题解,发现自己写得太麻烦了,干脆把 n 升级一个数据结构,用 long long 写,就没这个问题了
时间复杂度 O(logn) 空间复杂度O(1)
class Solution {
public:
double mylongPow(double x, long long n){
double xproduct = x, ans = 1;
while(n){
if(n & 1)
ans *= xproduct;
n = n >> 1;
xproduct *= xproduct;
}
return ans;
}
double myPow(double x, int n) {
long long N = n;
return N >= 0 ? mylongPow(x, N) : 1.0 / mylongPow(x, -N);
}
};
将 n 以二进制位表示,如果第 k 位为1,则最终次方结果应乘上 x^(2^k),因为是 int 类型的数,从补码角度来看如果从右往左第 32 位为 1,结果应乘上 x^(-2^32)
这样不行,因为会有 inf 的问题
把负数转换成正数计算,单独处理-2^31的问题,将其结果直接设置为 0
看题解,发现自己写得太麻烦了,干脆把 n 升级一个数据结构,用 long long 写,就没这个问题了
时间复杂度 O(logn) 空间复杂度O(1)
class Solution:
def myPow(self, x: float, n: int) -> float:
res = 1
if (n < 0):
x = 1 / x
n = 0 - n
while n != 0:
if n % 2 == 1:
res *= x
x *= x
n = n // 2
return res
//快速幂
//时间复杂度:O(logN) 空间复杂度:O(1)
class Solution {
public:
double myPow(double x, int n) {
double res = 1;
long y = n; // 不能用 int。
if (n < 0) {
y = -y;
x = 1 / x;
}
while (y > 0) {
if (y % 2 == 1) {
res *= x;
}
x *= x;
y /= 2;
}
return res;
}
};
class Solution{
public:
double myPow(double x, int n){
double res=1;
long y = n; // 不能用 int
if(n<0){
y = -y;
x = 1/x;
}
while(y>0){
if(y%2 == 1){
res *= x;
}
x *=x;
y /= 2;
}
return res;
}
}
class Solution {
public double myPow(double x, int n) {
if(x==0) return 0;
long b = n;
double res = 1.0;
if(b<0){
b = -b;
x = 1/x;
}
while(b>0){
if((b&1)==1) res *= x;
x *= x;
b >>= 1;
}
return res;
}
}
共以下 29 个回答
“`java
考虑边界问题,int的最小值转成正数会超过最大值的范围,越界
class Solution {
public double myPow(double x, int n) {
double res = 1d;
if (x == 0) {
return x;
}
if (n == -Integer.MAX_VALUE – 1) {
x = 1/(x*x);
n = -(n/2);
}
if (n < 0) { x = 1/x; n = -n; } while (n != 0) { if ((n & 1) == 1) { res = res * x; } n = n >> 1;
x = x * x;
}
return res;
}
}
class Solution {
public double myPow(double x, int n) {
double sum=1;
long N = n;
if(n<0){
N = -N;
x = 1/x;
}
while(N>0){
if((N&1)1){
sum = sumx;
}
x = xx;
N=N>>1;
}
return sum;
}
}
嘎嘎
“`java
这里需要注意的就是需要进行类型的转换。n如果为负值
public double myPow(double x, int n) {
//当成二进制看待,如果 例如n=13 1+4+8 1+4+8 1101 x 6
//2+4 110
double res=1;
long y=n;
if(y<0){
y=-y;
x=1/x;
}
while(y>0){
if(y%21){
res=resx;
}
x=xx;
y=y>>1;
}
return res;
“`C++
double myPow(double x, int n) {
if (n == 0) {
return 1.0;
}
}
“`
快速幂
时间:O(logn)
空间:O(1)
每次取余然后计算
【思路】利用位运算做优化,需要考虑n为正/负数两种情况
【复杂度】时间复杂度最好情况O(logn)最坏O(n),空间复杂度O(1)
时间复杂度o(logn), 空间复杂度o(1)
快速幂运算,时间复杂度O(logn) 空间复杂度O(1)
时间复杂度 O(logn)
空间复杂度O(1)
时间复杂度为O(logn)
空间复杂度为O(1)
将 n 以二进制位表示,如果第 k 位为1,则最终次方结果应乘上 x^(2^k),因为是 int 类型的数,从补码角度来看如果从右往左第 32 位为 1,结果应乘上 x^(-2^32)
这样不行,因为会有 inf 的问题
把负数转换成正数计算,单独处理-2^31的问题,将其结果直接设置为 0
看题解,发现自己写得太麻烦了,干脆把 n 升级一个数据结构,用 long long 写,就没这个问题了
时间复杂度 O(logn) 空间复杂度O(1)
将 n 以二进制位表示,如果第 k 位为1,则最终次方结果应乘上 x^(2^k),因为是 int 类型的数,从补码角度来看如果从右往左第 32 位为 1,结果应乘上 x^(-2^32)
这样不行,因为会有 inf 的问题
把负数转换成正数计算,单独处理-2^31的问题,将其结果直接设置为 0
看题解,发现自己写得太麻烦了,干脆把 n 升级一个数据结构,用 long long 写,就没这个问题了
时间复杂度 O(logn) 空间复杂度O(1)
MY快速幂
时间复杂度:O(log(n))
看的解析写的。
时间复杂度O(logn)
时间复杂度:O(n)
空间复杂度:O(1)
时间复杂度:O(logN)
空间复杂度:O(1)
c++实现
double myPow(double x, int n) {
double sum = 1;
double temp = x;
long ln=n;
if(n<0)
{
ln = -ln;
temp = 1/temp;
}
while(ln!=0)
{
考虑n为负数时,将x = 1/x, n = -n;
时间复杂度:O(logn)
空间复杂度:O(1)
思路:快速幂,二进制展开
时间复杂度:O(logn) 空间复杂度:O(1)
时间logn 空间1