给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
示例 1:
输入:16
输出:True
示例 2:
输入:14
输出:False
---------------分------------------------------------------------隔------------------------------------------------线-------------------------------------
直接想到的就是遍历,就是判断在1到num之间有没有一个i使得i*i = num;想到可能会超时,就使1<i<num/2;然后就会有一种特殊情况就使当num = 1的时候,无法给num除2,所以就加了一个判断,判断i是否等于1;
代码如下:
public static void main(String[] args) {
int n = 14;
int m = 25;
System.out.println(isSort(n));
System.out.println(isSort(m));
}
public static boolean isSort(int num){
if(num == 1){
return true;
}else{
for(int i = 1;i <= num/2;i++){
if(i*i == num)
return true;
}
}
return false;
}
虽然提交过了,但是 耗时681 ms 内存 32.2 MB,然后看了一下评论,可以使用二分法:
public static void main(String[] args) {
int n = 14;
int m = 16;
System.out.println(isSort(n));
System.out.println(isSort(m));
}
public static boolean isSort(int num){
int left = 0; //定义left左端点,right右端点,中间值mid
int right = num;
int mid = 0;
while(left <= right){ //当left <= right时,表示中间还有值,可以继续进行二分
mid = left + (right - left)/2; //将中间值赋给mid
if(mid == num*1.0/mid){ //mid == num*1.0/mid可以变形为mid*mid = sum,
return true;
}else if(mid > (num*1.0/mid)){ //如果mid太大了,就要将范围改变到另一半
right = mid -1;
}else{
left = mid + 1;
}
}
return false;
}
耗时:0ms