LeetCode___367.有效的完全平方数

给定一个正整数 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

二分查找:https://blog.csdn.net/DJGXGG/article/details/80375388

猜你喜欢

转载自blog.csdn.net/DJGXGG/article/details/88061725