LeetCode 69.x的平方根

本文介绍了一种使用二分法实现求非负整数平方根的算法,通过设定合理的边界避免溢出,并讨论了跳出循环的条件,确保算法效率。提供了一个C++代码示例,展示了如何处理平方根介于两个整数之间的特殊情况。

实现 int sqrt(int x) 函数。

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

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

示例 1:

输入: 4
输出: 2

示例 2:

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

自己用二分法写的时候,没考虑全跳出条件,陷入死循环。

代码参考来源https://blog.youkuaiyun.com/lyy_hit/article/details/49785677

由于有可能待求的平方根是介于两个整数之间的,这种情况需要判断处理。即如果中间值与左右边界的和的一半是相等的,那么现在的中间值就是上一循环中已经使用过的,也就是不需要再进行迭代计算了。同时此时的中间值,也是最接近平方根的整数值。

 

class Solution {
public:
    int mySqrt(int x) {
        
        if(x==0||x==1)
            return x;    
        
        int left=0,right=46341;  //右边界不以x为准,太大了会溢出
        int mid;
        int y;
        
        while(left<=right){
            if (mid == (left + right) / 2)
				break;
            
            mid=(left+right)/2;
            y=mid*mid;
            
            if(y==x)
                return mid;
                
            else if(y<x)
                left=mid;

            else
                right=mid;
        }
        
        return mid;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值