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



京公网安备 11010502036488号