Pow(x, n)
Implement int sqrt(int x).
Compute and return the square root of x.
实现开方
思路
拿到这个题我就笑了,这么简单,来个while撒
while(left<=right) mid = (l+r)/2
于是我就傻了,时间超了。。。。。。。。
一点不简单陷阱
1. n位负数
2. 时间复杂度,真的需要n次循环吗
并不!!!!还有就是最后返回的时候返回right值,而不是left
代码1没通过
当x是 2147395599 时,超时了
class Solution {
public:
int mySqrt(int x) {
if (x < 0)
return INT_MIN;
if (x == 0||x==1)
return x;
int left = 1,right = x;
while(left<=right)
{
int mid = (left+right)/2;
int pow2 = mid*mid;
if(pow2 == x)
return mid;
else if(pow2<x)
left = mid+1;
else
right =mid-1;
}
return right;
}
};
代码2通过
也没大改动,依旧是折半
但是在比较的时候,不是用的mid*mid,而是让x/mid然后和mid比较
唯一解释就是数据太大的时候,乘法太费时了
class Solution {
public:
int mySqrt(int x) {
if (x < 0)
return INT_MIN;
if (x == 0||x==1)
return x;
int left = 1,right = x;
int mid, factor;
while(left<=right)
{
mid = (left+right)/2;
factor = x/mid;
if(mid == factor)
return mid;
else if(mid<factor)
left = mid+1;
else
right =mid-1;
}
return right;
}
};
656

被折叠的 条评论
为什么被折叠?



