Valid Perfect Square

本文介绍了五种不同的算法来判断一个正整数是否为完全平方数,包括简单的循环遍历、优化的遍历策略、二分查找法、利用完全平方数性质的方法以及直接的数学验证。

1、题目

Given a positive integer num, write a function which returns True if num is a perfect square else False.

Note: Do not use any built-in library function such as sqrt.

Example 1:

Input: 16
Returns: True
Example 2:

Input: 14
Returns: False

2、求解一:比较正常的解法,也是比较容易想到的

public boolean isPerfectSquare(int num) {
        boolean flg = false;
        //注意这里要考虑特殊情况
        if(num == 1) return  true;
        //这里要从i=1开始,并且要有等号,这是在debug中测试发现的漏洞之处,导致一致不能accept
        for(int i = 1; i <= num/i; i++){
            if(num == i * i){
                flg = true;
            }
        }
        return flg;
    }

3、求解二:针对第一种思路,如何减小i遍历的次数

思路:如果num=36 ,对num/2=16, 16 * 16 =256 > num;再对16 / 2 = 8 ; 8 * 8 = 64 > num ; 再对8 /2 =4,4 * 4 < num , 所以现在我们就将范围缩小到了 4 --8  ,所以有的时候我们只需要简单用一个实际的例子就可以找出大概思路了

  public boolean isPerfectSquare(int num) {
        if(num == 1) return true;
        long m =  num / 2;
        long r = m * m;
        while( r > num){
            m = m /2 ;
            r = m * m;
        }
        //这里使得i的遍历次数最小
        for(long i = m; i < 2 * m; i++){
            if(m * m == num){
                return true;
            }
        }
        return false;
    }

4、求解四:二分法来寻找

 public boolean isPerfectSquare(int num) {
       int left = 1;
       int right = num;
       //利用while循环以 left<=right为终止条件
      while (left <= right){
          int middle = left + (right - left)/2;
          int s = middle * middle;
          if(s == num) return true;
          if(s > num){
              right = middle -1;
          }else left = middle + 1;
      }
      return false;
    }

5、求解五:利用完全平方是一系列奇数之和

  public boolean isPerfectSquare(int num) {
        //这里如何判断num是由一系列奇数的相加之和
        //利用while循环 看最后剩下的是不是0
        int i = 1;
        while (num > 0){
            num = num - i;
            i = i + 2;
        }
        return num == 0;

    }


转载于:https://www.cnblogs.com/flyingcr/p/10326889.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值