Given a positive integer num, return true if num is a perfect square or false otherwise. A perfect square is an integer that is the square of an integer. In other words, it is the product of some integer in itself.
给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
//api方法
class Solution {
public boolean isPerfectSquare(int num) {
int x = (int) Math.sqrt(num);
return x * x == num;
}
}
//手撕
class Solution {
public boolean isPerfectSquare(int num) {
int left = 0;
int right=num;
if(num==1){
return true;
}
while(left<=right){
int mid =left+(right-left)/2;
long dight = (long)mid*mid;//普通int接收可能会溢出
if(dight==num){
return true;
}
if(dight<num){
left=mid+1;
}else {
right =mid-1;
}
}
return false;
}
}
点评:本题快速的解法就是直接对num开根号得数再通过平方的方式区分是否与本身相同的方法,我使用的是二分查找的方法也能较快的锁定到最小可能目标值,使用api的方法比较巧妙,二分查找相对普通,同时可以使用暴力解法但相对的耗时会更高。
特殊情况及注意点:在测试代码时会出现数值溢出的现象,因为当num很大时mid*mid可能会超出int类型的范围导致溢出,所以需要将其强转为数值范围更大的long类型,同时二分查找法对num=1难以辨别所以提取为特殊情况。