这个题很早之前就做过了,使用二分查找来降低时间复杂度。但是边界的问题处理的不好。有两点需要注意:
1.left是从1开始的。
这是因为我们需要返回int类型,所以我们在做if判断的时候使用的是除法,防止超出范围。除数不能为0,所以先把特殊值0排除,因此left从1开始。
2.while中一直都是true
这是因为我们必须在while中返回结果才做这样的设定,题目要求向下取整。所以当mid>x/mid并且(mid+1)>x/(mid+1)时候,我们直接返回mid就可以了。
import java.util.*;


public class Solution {
    /**
     * 
     * @param x int整型 
     * @return int整型
     */
    public int sqrt (int x) {
        // write code here
        if(x==0) return 0;
        int left=1,right=x;
//         while(left<=right){
        while(true){
            int mid=left+(right-left)/2;
            if(mid>x/mid){
                right=mid-1;
            }else{
                if((mid+1)>x/(mid+1)) return mid;
                left=mid+1;
            }
        }
    }
}