二分法
二分法就是套模板。。。。
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); } }