题目中num的取值是整个int的取值,因此1-n暴力枚举一定是不可以的,但是当我们换一个角度来看这个题的时候,我们会发现,和我们熟悉的一个算法有相同之处。
从一个有序的数组中,找出符合条件的数字,这不就是我们所熟悉的二分查找吗?找到一个平方是num的数,从1开始顺序查找。
class Solution {
public boolean isPerfectSquare(int num) {
/*定义左边界*/
int left = 1;
/*定义右边界*/
int right = num;
/*定义边界条件*/
while(right>=left){
/*因为取值在整个int范围内,防止越界*/
int mid = left+(right-left)/2;
/*先除一下,方便下面条件的判定*/
int t = num/mid;
/*情况1:得到的余数等于mid,但是此时并不代表mid就一定是num的完全平方数
* 例如:当mid=2,num=5时,num/mid=2,但是2并不是5的完全平方数
* 因此还需要另一个判定条件,mid还要是num的整数倍.
* */
if(t==mid){
if(num%mid==0) return true;
/*如果不符合第二个条件,left+1,因为java中整数除法是向下取整,因此最终我们想要的结果一定大于当前这个数*/
left = mid+1;
} else if(t>mid){
/*下面就是正常二分的逻辑了*/
left = mid+1;
} else{
right = mid-1;
}
}
/*都不符合,跳出了*/
return false;
}
}