LeetCode-367. Valid Perfect Square (Java)

来源:互联网 发布:linux cgroups 编辑:程序博客网 时间:2024/06/05 20:41

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
------------------------------------------------------------------------------------------------------------------------------

题意

在不适用库函数的情况下,判断一个数是否为某个数的平方。

思路

最简单的思路就是利用循环,当i的值大于num值的一半时结束循环,然后判断i*i是否等于num。

这样虽然可以实现需求,但是耗时比较长,需要更进一步的程序优化。

代码

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

在num/2的基础上,再进行了折半查找,执行循环的条件是left+1>right,如果改为left>right,则有可能进入死循环。

比如当num=4时,left=1,right=2,mid=1;此时,mid*mid=1,小于num,则执行left=mid,这样left还是1,又会进行同样的循环。