问题描述:
Given a non-negative integer x, compute and return the square root of x.
Since the return type is an integer, the decimal digits are truncated, and only the integer part of the result is returned.
求平方根(舍弃小数点)
一刷,二叉搜索:
class Solution {
public int mySqrt(int x) {
if ((x==0)||(x==1)) return x;
long left = 1;
long right = x;
while(left<right){
long middle = (left + right)/2;
long ans =middle * middle;
if (middle*middle==x) return (int)middle;
else if (middle*middle>x) {
right = middle;
}
else{
left = middle + 1;
}
}
return (int)left-1;
}
}
当时因为int上界的问题困扰了我很久,后来改成long类型一切就好了
二刷:二叉搜索强化改进:
class Solution {
public int mySqrt(int x) {
//step1: find out the left_bound and right_bound
long left=0;
long right=x;
//我习惯不把=放在循环里,我习惯让循环停在left=right上(如果中途没有触发exact话)
//这样的好处是,循环停下来后,不用绞尽脑汁想是用left还是用right,这下好了,左右都一样
while(left<right){
long mid=left+(right-left)/2;
//too small?
if(mid*mid<x){
left=mid+1; //如果循环条件不带等号,这里必须是mid+1
}
//exact
else if(mid*mid==x){
return (int)mid;
}
//too big?
else{
right=mid; //如果循环条件不带等号,这里必须是mid
}
}
//handle the case when left=right
//如果程序执行到这里,那么恭喜,left=right
if(left*left==x) return (int)left; //如果这个刚好是,那么就返回他
else if (left*left>x){ //如果这个比目标大,则只能是它前一个
return (int)left-1;
}
else{
return (int)left+1; //如果这个比目标小,则只能是后一个
}
}
}