这个题很早之前就做过了,使用二分查找来降低时间复杂度。但是边界的问题处理的不好。有两点需要注意:
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; } } } }