题目描述:
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
示例 1:
输入:16
输出:True
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-perfect-square
暴力解法:
class Solution {
public boolean isPerfectSquare(int num) {
if (num == 1) return true;
else {
int a = num / 2;//判断一个数是平方数,使用循环暴力破解,从1,2.3...不断试
int i = 1; //但是只需要试到num/2,因为之后的数字的平方一定大于num
while (i <= a) {
if (i * i == num) return true;
else i++;
}
return false;
}
}
}
二分查找解法:
class Solution {
public boolean isPerfectSquare(int num) {
if (num == 1) return true;
long left = 1;
long right = num;
while (left <= right) { //如果直接让left+right,可能会溢出
long mid = (long) (left + (right - left) / 2);//这样写是防止溢出
long temp = mid * mid;
if (temp < num)
left = mid + 1;
else if (temp == num) return true;
else if (temp > num) right = mid - 1;
}
return false;
}
}
ps:在二分查找中,如果使用int类型,在后面计算mid*mid时,有可能会超范围,会提示超时