LeetCode:Sqrt(x)

心碎的一道题 啊,其实是蛮简单的,但是我想复杂了。在用二分法的时候是在想不好判断条件应该返回哪个值,mid,high还是low,最后发现low跟mid都有可能超过正确值,只有high一定大于等于正确值,枚举一下就好了。

还有数值的大小一定要设成unsigned long long,不然开根号算的数值不够大。

class Solution{
	public:
		int sqrt(int x){
			unsigned long long low=0;//要用unsigned long long不然数值不够大
			unsigned long long high=x;
			unsigned long long mid=0;
			if(x==1)return 1;           
			while(low<high){  //典型2分查找 
				mid=(low+high)/2;
				if(mid*mid==x){
					return mid;
				}
				else if(mid*mid<x){
					low=mid+1;
				}
				else if(mid*mid>x){
					high=mid-1;
				}
			} 
			//想了半天还没想清楚,只好枚举一下了,注意一定要用high枚举,mid因为没有变,可能会越界的 
			if((high-1)*(high-1)==x)return high-1;
			else if(high*high==x)return high;
			else if((high-1)*(high-1)<x&&high*high>x)return high-1;
			else if(high*high<x&&x<(high+1)*(high+1))return high;		
		}
};    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值