JAVA(2021-11-4)leetcode每日一题----有效的完全平方数

力扣 

        题目中num的取值是整个int的取值,因此1-n暴力枚举一定是不可以的,但是当我们换一个角度来看这个题的时候,我们会发现,和我们熟悉的一个算法有相同之处。

        从一个有序的数组中,找出符合条件的数字,这不就是我们所熟悉的二分查找吗?找到一个平方是num的数,从1开始顺序查找。

        

class Solution {
        public boolean isPerfectSquare(int num) {
            /*定义左边界*/
            int left = 1;
            /*定义右边界*/
            int right = num;
            /*定义边界条件*/
            while(right>=left){
                /*因为取值在整个int范围内,防止越界*/
                int mid = left+(right-left)/2;
                /*先除一下,方便下面条件的判定*/
                int t = num/mid;
                /*情况1:得到的余数等于mid,但是此时并不代表mid就一定是num的完全平方数
                * 例如:当mid=2,num=5时,num/mid=2,但是2并不是5的完全平方数
                * 因此还需要另一个判定条件,mid还要是num的整数倍.
                * */
                if(t==mid){
                    if(num%mid==0) return true;
                    /*如果不符合第二个条件,left+1,因为java中整数除法是向下取整,因此最终我们想要的结果一定大于当前这个数*/
                    left = mid+1;
                } else if(t>mid){
                    /*下面就是正常二分的逻辑了*/
                    left = mid+1;
                } else{
                    right = mid-1;
                }
            }
            /*都不符合,跳出了*/
            return false;
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值