20191205更新
//最后一个平方小于等于target的数
class Solution {
public:
int mySqrt(int x) {
int left = 0;
int right = x;
while(left <= right){
auto bet = left+((right-left)>>1);//一定要记住>>优先级低于加减乘除
if(bet > x/double(bet))//这里是为了防止越界,但是做了除法就必然存在舍弃误差,如果是float某些情况下就是不对的,double也只可能是尽可能精确
right = bet-1;
else{
if(bet == x || (bet+1)>x/double(bet+1))
return bet;
else
left = bet + 1;
}
}
return -1;
}
};
感觉这个题意义不大,防止越界做除法必然有精度损失,不过同时除以一个数再比较的思想值得学习。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class Solution {
public:
int mySqrt(int x) {
if(x == 0)
return 0;
if(x == 1)
return 1;
int left = 0;
int right = x;
while(left <= right){
int mid = (left + right)/2;
if(mid <= x/mid){ //平方小于等于x的最后一个整数
if(mid == x || (mid+1) > x/(mid+1)) //对于大数,这里使用了同时除以mid,但要保证 mid != 0
return mid;
else{
left = mid+1;
}
}
else{
right = mid-1;
}
}
return -1; //上面的循环必然可以return结果,GitHub编译器要求必须按照函数的声明显式返回int值
}
};