【二分查找-leetcode69.x的平方根 | 367.有效的完全平方数】

题目1: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
题目链接

分析: 注意二分的运用,平方根是目标值,那肯定要划出一个范围,大于等于0,则0为下界,找x的平方根,那x就为上界,符合二分要求。
注意:如果 mid * mid 的结果超出了 int 类型的范围(即大于 Integer.MAX_VALUE),就会发生溢出,结果会变成负数或其他不正确的值,所以加个long

class Solution {
    public int mySqrt(int x) {
        //此处想一下,为什么可以用二分?
        //因为求目标值是非负数,且肯定在递增数中,通过划定范围来找到它。
        int l=0;//二分查找的上界
        int r=x;//下界,因为求的是x的算术平方根,划定x为上界刚好符合。
        int n=-1;//最终的结果赋值
        while(l<=r){
            int mid=(l+r)/2;//平方根肯定除2,然后看他除尽与否!
            //如果 mid * mid 的结果超出了 int 类型的范围(即大于 Integer.MAX_VALUE),就会发生溢出,结果会变成负数或其他不正确的值
            if((long)mid*mid<=x){ //倘若得到的mid的平方小于x,肯定有戏(long确保了即使 mid * mid 很大时也不会溢出,能更精确一点)
                n=mid;
                l=mid+1;
            }else{
                r=mid-1;//都已经超过x了,肯定不是算术平方根的范畴了,给他减减。
            }
        }
        return n;//返回最终的结果。
    }
}

题目2: 给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
完全平方数是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
示例 1:
输入:num = 16
输出:true
解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。
示例 2:
输入:num = 14
输出:false
解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742 不是一个整数。
题目链接

class Solution {
    public boolean isPerfectSquare(int num) {
        int left=0;
        int right=num;
        boolean ant=false;
        while(left<=right){
            int mid=(left+right)/2;
            long s=(long)mid*mid;
            if(s<num){
                left=mid+1;
            }else if(s>num){
                right=mid-1;//     64/2=32,32太大要减减
            } else {
                return  true;
            }
        }
        return false;
    }
}

分析: 学会理解二分的应用,划边界取中值,而边界条件来自题目中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值