题目描述
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
-
示例 1:
输入:16
输出:True -
示例 2:
输入:14
输出:False
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-perfect-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
二分法,通过比较n2与num之间的大小关系,决定左右双指针p、q的走向。
代码详解
class Solution {
public boolean isPerfectSquare(int num) {
// 注意下方大部分都是用long来修饰的
// 为了防止n*n和p+q超出int范围,因而使用long来修饰
long p = 0;
long q = num;
// 以下便是典型的二分法循环流程
while(p <= q) {
long n = (p + q) / 2;
if(n * n == num) {
return true;
} else if(n * n < num) {
p = n + 1;
} else {
q = n - 1;
}
}
return false;
}
}
注意点
- 注意加法和乘法的超界隐患,特别是对于int来说。
- 也可以使用牛顿法进行数学计算,在这里不展开描述。