原題鏈接在這裏: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;
}
}