今日之題目大意:給你一個非負整數 x,請你計算並回傳 x 的平方根(只取整數部分,捨去小數),而且不能用任何內建函數(像 Math.sqrt)。
範例
輸入:x = 4
輸出:2
輸入:x = 8
輸出:2(因為真實平方根是 2.828...,要捨去小數,只取整數 2)
class Solution {
public int mySqrt(int x) {
if (x < 2) return x; //如果 x 是 0 或 1,直接回傳 x
int left = 1, right = x / 2; //因為一個數的平方根不可能大於它的一半
int ans = 0; //用 ans 記錄「目前找到的最大合法平方根候選值」
while (left <= right) {
int mid = left + (right - left) / 2; //取中間值 mid,這樣寫是為了避免 (left + right) / 2 可能造成整數溢位(overflow)
long square = (long) mid * mid;
if (square == x) {
return mid;
} else if (square < x) {
ans = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
return ans;
}
}