We should keep in mind that never let the integer value overranged or overstacked..
Here is the trick, instead of comparing the square of a interger with the target value, we can compare the integer value i with the quotient x/i;
if(i > x/i) high = i - 1; if(i < x/i) low = i +1, the condition of the while is loop is low < high. Thus when the loop ends, low = high. There are two results, one is the low point to the integer which is the sqrt(x), the other is low = sqrt(x)+1. We need to check the two cases in the end.
Code:
public class Solution { public int mySqrt(int x) { if(x<0) return -1; if(x == 0) return 0; if(x == 1) return 1; int low = 1, high = x; while(low < high){ int mid = low+(high-low)/2; int quotient = x/mid; if(quotient == mid) return mid; else if(mid > quotient){ high = mid-1; } else{ low = mid + 1; } } int quotient = x/low; if(low > quotient) return low -1; return low; } }
Newton‘s method to get square root:
Code:
public int mySqrt(int x) { if (x == 0) return 0; long i = x; while(i > x / i) i = (i + x / i) / 2; return (int)i; }
时间: 2024-12-13 15:59:30