Leetcode 69: Sqrt(x)

问题描述:

Given a non-negative integer x, compute and return the square root of x.
Since the return type is an integer, the decimal digits are truncated, and only the integer part of the result is returned.
求平方根(舍弃小数点)

一刷,二叉搜索:

class Solution {
    public int mySqrt(int x) {
        
        if ((x==0)||(x==1)) return x;
        long left = 1;
        long right = x;
        
        while(left<right){
            long middle = (left + right)/2;
            long ans =middle * middle;
            if (middle*middle==x) return (int)middle;
            else if (middle*middle>x) {
                right = middle;
            }
            else{
                left = middle + 1;
            }
        }
        return (int)left-1;
    }
}

当时因为int上界的问题困扰了我很久,后来改成long类型一切就好了

二刷:二叉搜索强化改进:

class Solution {
    public int mySqrt(int x) {
        //step1: find out the left_bound and right_bound
        long left=0;
        long right=x;
        //我习惯不把=放在循环里,我习惯让循环停在left=right上(如果中途没有触发exact话)
        //这样的好处是,循环停下来后,不用绞尽脑汁想是用left还是用right,这下好了,左右都一样
        while(left<right){
            long mid=left+(right-left)/2;
            //too small?
            if(mid*mid<x){
                left=mid+1;      //如果循环条件不带等号,这里必须是mid+1
            }
            //exact
            else if(mid*mid==x){
                return (int)mid;
            }
            //too big?
            else{
                right=mid;      //如果循环条件不带等号,这里必须是mid
            }
        }
        //handle the case when left=right
        //如果程序执行到这里,那么恭喜,left=right
        if(left*left==x)  return (int)left;  //如果这个刚好是,那么就返回他
        else if (left*left>x){      //如果这个比目标大,则只能是它前一个
            return (int)left-1;
        }
        else{
            return (int)left+1;   //如果这个比目标小,则只能是后一个
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值