leetcode思路总结反思(Math篇)
69. Sqrt(x)
最开始采用:
class Solution {
public:
int mySqrt(int x) {
int i=1;
while(i*i<=x)
i++;
return i-1;
}
};
这样子不仅速度慢,而且到后面i*i会int溢出;
后改成:
class Solution {
public:
int mySqrt(int x) {
int i=1;
while(x/i>=i)
i++;
return i-1;
}
};
解决了i*i int溢出的问题,但是速度巨慢;
class Solution {
public:
int mySqrt(int x) {
int lb=0;
int ub=INT_MAX;
int mid;
while((ub-lb)>1)
{
mid=(ub+lb)/2;
if(x/mid>=mid)
lb=mid;
else
ub=mid;
}
return lb;
}
};
常规的二分做法,mid=(ub+lb)/2仍然会产生int溢出
class Solution {
public:
int mySqrt(int x) {
int lb=0;
int ub=INT_MAX;
int mid;
while((ub-lb)>1)
{
//mid=(ub+lb)/2;
mid=lb+(ub-lb)/2;
if(x/mid>=mid)
lb=mid;
else
ub=mid;
}
return lb;
}
};
改变mid的产生方法,采用mid=lb+(ub-lb)/2;终于解决问题