leetcode【中级】 x的平方根 Java

题干

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:

输入: 4
输出: 2

示例 2:

输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 
     由于返回类型是整数,小数部分将被舍去。

想法

直接去除小数部分,有暴力法,二分法,牛顿迭代法几种办法。
看到网上有直接用Math.sqrt的,我就只是想说你辣是真的牛批,可以直接调用Math类我还做个

Java 代码

暴力

class Solution {
	    public int mySqrt(int x) {
	    	int i;
	    	for(i=0;i<=x;i++){
	    		if(i*i>x||i*i<0){//防止溢出,超过整数的最大值
	    			break;
	    		}
	    	}
	    	return i-1;
	    }
}

二分法

public int mySqrt(int x) {
    if(x <= 1)
        return x;
    int left = 1,right = x;
    while(left <= right){
        int mid = left + (right -left) / 2;
        int sqrt = x / mid;
        if(sqrt == mid)
            return mid;
        else if(sqrt < mid)
            right = mid - 1;
        else
            left = mid + 1;
    }
    return right;
}
class Solution {
    public int mySqrt(int x) {
       	long left = 0;
		long right = Integer.MAX_VALUE;
		while(left<right){
			long mid = (left + right + 1)>>>1;  //>>>为无符号右移
			long square = mid*mid;
			if(square>x){
				right = mid-1;
			}else{
				left = mid;
			}
		}
		return (int) left;
}
}

牛顿迭代法

这是数值分析的内容,具体的解析不熟悉的可以参考
https://blog.csdn.net/weixin_42130471/article/details/82730562
代码:

class Solution {//牛顿迭代法,f(x)=x^2-t
    public int mySqrt(int x) {
        double t=(double)x;//(double)可以省
        double x0=x;
        x0=x0/2+t/(2*x0);
        while(Math.abs(x0*x0-t)>0.00001)
            x0=x0/2+t/(2*x0);
        return (int)x0;//double 转int类型必须使用强制类型转化
    }
}

或者:

public int mySqrt(int x) {
   long r = x;
while (r*r > x)
    r = (r + x / r) / 2;
return (int) r; 
}

思路代码参考:https://blog.csdn.net/weixin_42130471/article/details/82730562

你可能感兴趣的:(leetcode刷题,Java,leetcode)