原题链接在这里:https://leetcode.com/problems/sqrtx/
很自然的想到由小到大每个数算平方和x比较,但如此会用O(n)时间。
类似此类查找可以用 Binary Search, 先找middle = (left + right)/2, middle^2 和 x 比较,比x小就在middle 和 right这段找,反之亦然。
Note: 1. middle 要设为long, 否则middle * middle 可能overflow
2. while loop的条件是l<=r, 别忘了=
3. return 别忘了加cast
4. 即使这不是一个perfect square 也是返回right, 因为此时right就是那个较小的值。
AC Java:
public class Solution {
public int mySqrt(int x) {
//Binary Search
if(x<0){
return 0;
}
int l = 0;
int r = x;
while(l<=r){ //error
long middle = (l+r)/2;
if(middle * middle < x){
l = (int)middle + 1;
}else if(middle * middle >x){
r = (int)middle - 1;
}else{
return (int)middle; //error
}
}
return r;
}
}