力扣 367有效的完全平方数 题解(java实现 二分查找)

在这里插入图片描述

     先来说说普通方法,就是调用库函数sqrt,如果一个数的开方的平方等于它本身,这个数字就是完全平方数,因为如果它的开方是float或者double型,转换为int型会有数字缺失,他们的平方就不会是这个数本身。

class Solution {
    
    
    public boolean isPerfectSquare(int num) {
    
    
        int m=(int)Math.sqrt(num);
        if(m*m==num) {
    
    
            return true;
        }
        return false;
    }
}

     再来说说进阶,其实试过之后,进阶的时间复杂度,空间复杂度其实和普通方法差不多,没必要这么写,只是想让我们知道二分法可以判断一个数是不是完全平方数。
     演示过程我找到一篇题解,就拿这位dalao的图来解释整个过程吧。
在这里插入图片描述

     如果是1的话,就没有左右指针,我们又知道1是一个完全平方数,所以直接返回true,
     一个数的开根肯定比他自己小,所以判断的范围就是在0-num,先求出来mid,如果mid的平方比num大,说明说明num的开方在mid的左边(不包括mid),如果mid的平方比num小,说明num的开方在mid的右边(不包括mid)。

lass Solution {
    
    
    public boolean isPerfectSquare(int num) {
    
    
        // 二分
        if(num == 1) {
    
    
            return true;
        }
        long left = 0;
        long right = num;
        long mid = (left+right)/2;
        long tmp;
        while(left <= right) {
    
    
            tmp = mid * mid;
            if(tmp == num) {
    
    
                return true;
            } else if(tmp > num) {
    
    
                right = mid-1;
            } else {
    
    
                left = mid+1;
            }
            mid = (left+right)/2;
        }
        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_51656756/article/details/121134649