Redian新闻
>
Pow有没有比log(n)更好点的解法?
avatar
Pow有没有比log(n)更好点的解法?# JobHunting - 待字闺中
l*h
1
比如下面这个log(n)的, 很容易实现,为什么喜欢考这个题?
public double pow(double x, int n) {
if (n == 0) return 1;
if (x == 0) return 0;
boolean positive = true;
if (n < 0) {
positive = false;
n = -n;
}

double tmp = pow(x, n/2);
double ret;
if (n%2 == 0) {
ret = tmp*tmp;
}
else {
ret = x*tmp*tmp;
}
return positive ? ret : 1.0/ret;
}
avatar
t*h
2
pow(1,12323243243)?

【在 l**h 的大作中提到】
: 比如下面这个log(n)的, 很容易实现,为什么喜欢考这个题?
: public double pow(double x, int n) {
: if (n == 0) return 1;
: if (x == 0) return 0;
: boolean positive = true;
: if (n < 0) {
: positive = false;
: n = -n;
: }
:

avatar
b*h
3
就算容易实现 也不是都可以实现的好 从实现上也能看出功底 比如说这个递归可以更
简洁 甚至不用递归
avatar
j*n
4
agreed. theres definitely room for improvement, not necessarily in terms of
complexity but implementation.

【在 b*********h 的大作中提到】
: 就算容易实现 也不是都可以实现的好 从实现上也能看出功底 比如说这个递归可以更
: 简洁 甚至不用递归

avatar
l*h
5
找到一个号称constant time解决的,还没看懂,最后一种解法:
http://blog.unieagle.net/2012/08/23/leetcode%E9%A2%98%E7%9B%AE%

【在 l**h 的大作中提到】
: 比如下面这个log(n)的, 很容易实现,为什么喜欢考这个题?
: public double pow(double x, int n) {
: if (n == 0) return 1;
: if (x == 0) return 0;
: boolean positive = true;
: if (n < 0) {
: positive = false;
: n = -n;
: }
:

avatar
c*t
6
最后一种解法貌似也是lgn的。按n的binary走的,本质与n/2应该一样
pow(double, double)应该怎么做?

【在 l**h 的大作中提到】
: 找到一个号称constant time解决的,还没看懂,最后一种解法:
: http://blog.unieagle.net/2012/08/23/leetcode%E9%A2%98%E7%9B%AE%

avatar
w*o
8

好像不是Constant time。任然是O(lgn)。而且还可以简化:
public class Solution {
public double pow(double x, int n) {
boolean isNeg = n < 0;
if(n < 0)
n = -n;

double ret = 1.0;
while(n>0) {
if((n&1) >0)
ret *= x;
x *= x;
n >>= 1;
}

return isNeg? 1.0/ret : ret;
}
}

【在 l**h 的大作中提到】
: 找到一个号称constant time解决的,还没看懂,最后一种解法:
: http://blog.unieagle.net/2012/08/23/leetcode%E9%A2%98%E7%9B%AE%

avatar
f*n
9
return exp(n * log(x)) 不就行了吗?
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。