40.Sqrt(x) (二分查找)

mplement int sqrt(int x).

Compute and return the square root of x.

分析:

这道题目可以用二分查找的方法找 x 的平方根。

public int mySqrt3(int x) {
		 if(x<=1){
			 return x;
		 }
		 long low = 0;
		 long high = x;
		 long mid = 0;//这里用long long 是方便下面计算,如果用int会报错
		 while(low <= high){
			 mid = low+(high-low)/2;
			 if(mid == x/mid){
				 return (int) mid;
			 }
			 if(mid * mid < x){//因为这里有 两个int相乘的情况,可能会溢出,所以要把mid定义成long的形式
				 low = mid +1;
			 }else{
				 high = mid - 1;
			 }
		 }
		// 当找不到时候,这是low,high指针已经交叉,取较小的,即high
		 return (int) high; 
	    }

但是需要特别注意的是,当有两个int相乘的时候,要将其定义为long型,否则会造成溢出,使结果不准确。或者定义一个double型来先扩大其字节长度。

public int mySqrt2(int x){
		  	double diff = 0.01;     // 误差
	        int low = 0;
	        int high = x;
	         
	        while(low <= high){
	            // 注意越界!所以用double来存
	            double mid = low + (high-low)/2;
	            if(Math.abs(mid*mid-x) <= diff){
	                return (int)mid;
	            }else if(x > mid*mid+diff){
	                low = (int)mid+1;
	            }else if(x < mid*mid-diff){
	                high = (int)mid-1;
	            }
	        }
	         
	        // 当找不到时候,这是low,high指针已经交叉,取较小的,即high
	        return high;
	 }

如果一定要定义成int型,那么在计算的时候要先计算除法,避免让两个int直接相乘。

public int mySqrt(int x) {//提交通过
		 if(x<=1){
			 return x;
		 }
		 int low = 0;
		 int high = x;
		 int mid = 0;
		 while(low <= high){
			 mid = low+(high-low)/2;
			 if(mid == x/mid){
				 return mid;
			 }
			 if(mid < x/mid){//当这个地方是mid*mid的时候提交就不通过。因为两个int相乘,很容易造成溢出
				 low = mid +1;
			 }else{
				 high = mid - 1;
			 }
		 }
		// 当找不到时候,这是low,high指针已经交叉,取较小的,即high
		 return high; 
	    }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值