1. 程式人生 > >LeetCode367題:有效的完全平方數

LeetCode367題:有效的完全平方數

這道題就是讓你寫一個函式用來判斷一個是num是否為某個數m的平方的。

解法一:暴力搜尋法

判斷一個數是不是某個數的平方,暴力一點的想法,就是從i = 1開始迴圈,如果i*i小於num,則i++;如果等於num,則返回true;如果大於num,則返回false。

public static boolean isPerfectSquare(int num) {
        if(num <= 0)
        	return false;
        if(num == 1)
        	return true;
		for(int i=1;i<num;i++){
        	if(i*i < num){
        		continue;
        	}else if(i*i == num){
        		return true;
        	}else{
        		return false;
        	}
        }
        return false;
    }

解法二:公式法

如果一個數num是完全平方數,那麼一定存在一個n使得1+3+5+...+n = num。

public static boolean isPerfectSquare1(int num) {
        if(num <= 0)
        	return false;
        if(num == 1)
        	return true;
        int sum = 1;
        while(num > 0){
        	num -= sum;
        	sum += 2;
        }
        return num == 0;
    }

解法三:雙指標二分逼近法

思路是使用左右兩個指標 left 和 right 來表示從1到num之間的兩個數,並計算mid = (left+right)/2,如果mid*mid == num則返回true;如果小於num,則說明如果存在一個數n使得n*n == num的話,那麼n一定大於mid,所以修改left = mid+1進行下一次比較;同理,如果大於num,則修改right = mid-1。(不要使用left = left+1這種方式,這樣就失去二分的效果了)

public static boolean isPerfectSquare2(int num) {
        if(num <= 0) 
            return false;
        if(num == 1) 
            return true;
        long l=1, r = num/2; 
        long mid, midSq;
        while(l <= r){
            mid = (l + r)/2;
            midSq = mid * mid;
            if(midSq == num) return true;
            if(midSq < num) l = mid+1;
            else r = mid-1;
        }
        return false;
    }