367. Valid Perfect Square

来源:互联网 发布:yunos删除预装软件 编辑:程序博客网 时间:2024/06/05 17:49

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: 16Returns: True

Example 2:

Input: 14Returns: False

思路1:由于不能使用sqrt()方法,所以 i 从1循环到 n/2,判断i的平方是否等于num,时间复杂度为O(n/2)

    public boolean isPerfectSquare(int num) {        int a = num / 2 + num % 2; //不知道能否使用 %        for(int i = 1; i < a; i++) {            if(i * i == num) return true;        }        return false;    }

思路2:
1 = 1
4 = 1 + 3
9 = 1 + 3 + 5
16 = 1 + 3 + 5 + 7
………………………………
根据上面的规律,设置一个标志位,从1开始自增,每次加2,直到和num相等,时间复杂度O(sart(n))

    public boolean isPerfectSquare(int num) {        int i = 1;        while(num > 0) {            num -= i;            i += 2;        }        return num == 0;    }

思路3:二分法,时间复杂度O(logn),在时间复杂度上,O(logn) < O(sqrt(n))

    public boolean isPerfectSquare(int num) {        int l = 1;        int r = num;        while(l <= r) {            long m = (l + r) >>> 1;  // 注意,l + r可能超过int类型表示范围,>>>无符号右移            if(m * m == num) return true;            else if(m * m < num) {                l = (int)m + 1;            }else {                r = (int)m - 1;            }        }        return false;    }
原创粉丝点击