【LeetCode-简单】69. x 的平方根 (详解)

题目

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

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

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。


题目地址:https://leetcode.cn/problems/sqrtx
 

示例

方法1:暴力循环(蠢)

作者:本人

思路:

求开方?那不是很简单,直接从1开始一个一个试呗,谁的平方==x,那就是谁喽。 

class Solution {
    public int mySqrt(int x) {
        for (int i=1;i<=x;i++){
            if (i*i==x)return i;
            if (i*i<x && (i+1)*(i+1)>x)return i;
        }
        return 0;
    }
}

提交之后就是失败,因为超时了,因为当x是很大的数字的时候,你一个一个遍历,肯定很费时间。

方法2:二分法

作者:本人

思路:

为了解决超时问题,那我们就用二分法。

最左设置为0,最右设置为x,那中间mid就是 (left+right)/2,如果mid*mid ==x,那就说明找到了结果,如果 <x,那说明中间数mid 太小了,我们放大点,让left移动到mid,反之让right 移动到mid。

一直循环,循环条件是 left必须<right ,还有一种情况是 left 和 right 只相差1,说明真实答案是比left大一点,比right小一点,那就直接返回left即可。

注意

前面我一直是用的 下面这种方式,可是答案就是不通过,提示超时

if (mid * mid == x)return mid;

说明平方有问题,看了网上别人的做法,非常的巧妙,直接将所有的 a * b == c 的模式改成 a == c / b 即可

例如上面就改成

if (mid  ==x/mid)return mid;

答案直接通过

class Solution {
    public int mySqrt(int  x) {
        if (x<4 && x>0)return 1;
        int left = 0;
        int right = x;
        while (left<right){
            int mid = (left + right)/2;
            if (mid  ==x/mid)return mid;
            if (left+1 == right){
                return left;
            }
            if (mid > x/mid){
                right = mid;
            }else if (mid  < x/mid){
                left = mid;
            }
        }
        return 0;
    }
}

 方法3:二分法(完美版)

思路

与方法2一致,比我的更优秀

作者:力扣:Noble Monster

int mySqrt(int x) 
    {
        if(x == 1)
            return 1;
        int min = 0;
        int max = x;
        while(max-min>1)
        {
            int m = (max+min)/2;
            if(x/m<m)
                max = m;
            else
                min = m;
        }
        return min;
    }

总结

1. 不要再惦记你那个b暴力循环了,真的很蠢,多想想二分法之类的好方法。

2.为了防止溢出,我们可以用 x/m<m  而不是m*m>x

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值