有效的完全平方数
力扣链接:367. 有效的完全平方数
题目
给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
完全平方数
是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。不能使用任何内置的库函数,如 sqrt 。
示例 1:
输入:num = 16
输出:true
解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。
示例 2:
输入:num = 14
输出:false
解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742 不是一个整数。
提示:
1 <= num <= 231 - 1
分析或原理
方法一:使用内置的库函数
根据完全平方数的性质,我们只需要直接判断num*num的平方根i是否为整数即可。
方法二:暴力遍历
从1 开始,从小到大遍历所有正整数,寻找是否存在满足
i * i =num
的正整数i
。在遍历中,如果出现正整数i * i > num
,则i
的后面不可能再出现我们需要的值了。
方法三:二分查找
考虑使用二分查找来优化搜索过程。我们可以将
1
和num
作为二分查找搜索区间的初始边界。
题解
解法一:
class Solution {
// 使用Math.sqrt方法
public boolean isPerfectSquare(int num) {
// 使用内置方法直接求目标值的完全平方数
int i = (int) Math.sqrt(num);
// 判断i的平方是不是等于目标值并返回Boolean
return i * i == num;
}
}
解法二:
class Solution {
// 暴力遍历
public boolean isPerfectSquare(int num) {
// 定义变量i从一开始递增,square存储i*i的值
long i = 1, square = 1;
// 循环出口就是i的平方值square超过了num就可以结束了
while (square <= num) {
// 如果找到的就直接返回ture
if (square == num) {
return true;
}
// 循环变化条件
i++;
// 求i的平方
square = i * i;
}
// 如果没有找到返回false
return false;
}
}
解法三:
class Solution {
// 二分查找
public boolean isPerfectSquare(int num) {
// 定义左右边界
int left = 0;
int right = num;
// 开始二分查找
while(left <= right) {
// 确定中间值
int mid = (right - left) / 2 + left;
// 计算中间值的平方存入square中
long square = (long) mid * mid;
// 比较square和目标值num的大小
if(square > num) { // 如果比目标值大右边界减一
right = mid - 1;
}else if(square < num) { // 如果比目标值小左边界等于mid+1
left = mid + 1;
}else { // 否则就找到了
return true;
}
}
// 如果没找到就返回false
return false;
}
}
路漫漫其修远兮,吾将上下而求索。愿你永远保持对未来的热情和期望,不断追寻自己的梦想,成为自己想要成为的人。