二分法

二分法就是套模板。。。。

int binarySearch(int[] nums, int target) {
    int left = 0; 
    int right = nums.length - 1; // 注意
    while(left <= right) {
        int mid = left + (right - left) / 2;
        if(nums[mid] == target)
            return mid; 
        else if (nums[mid] < target)
            left = mid + 1; // 注意
        else if (nums[mid] > target)
            right = mid - 1; // 注意
    }
    return -1;
}

唯一就是条件变了。
条件是: mid * mid == x
或者: mid * mid < x 且 mid+1 * mid +1 < x

    public int mysqrt(int x) {
        if (x <= 0) {
            return 0;
        }
        long left = 0;
        long right = x;
        while (left <= right) {
            long mid = left + ((right - left) >> 1);
            if (mid * mid == x || ((mid * mid < x) && ((mid + 1) * (mid + 1) > x))) {
                return (int) mid;
            } else if (mid * mid < x) {
                left = mid + 1;
            } else if (mid * mid > x) {
                right = mid - 1;
            }
        }
        return -1;
    }

牛顿迭代

这是一个微积分的公式。 。 。我也不太懂。 直接套公式就行了。
如果 :X = N^2
那么 ( X/N + N ) /2 就会无限接近N 。 直到等于 至于这个N这个值是多少并不重要。
这里用递归写的:

    public int mysqrt(int x) {
          if(x<=0){
              return 0;
          }
          return newton(x,x);
      }
      // i 是x开方值 , x 要输入的值 
      public int newton(double i,int x) {
        double res = (x / i + i) / 2;
        if (res == i) {
            return (int) res;
        } else {
            return newton(res, x);
        }
    }