1. 程式人生 > >LeetCode演算法題-Valid Perfect Square(Java實現-四種解法)

LeetCode演算法題-Valid Perfect Square(Java實現-四種解法)

這是悅樂書的第209次更新,第221篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第77題(順位題號是367)。給定正整數num,寫一個函式,如果num是一個完美的正方形,則返回True,否則返回False。例如:

輸入:16
輸出:true

輸入:14
輸出:false

注意:不要使用任何內建庫函式,例如sqrt。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

暴力解法,定義一個long型別的變數,for迴圈判斷其平方是否小於num,但是不要寫迴圈體,這樣省時,最後直接判斷其平方是否等於num。

public boolean isPerfectSquare(int num) {
    if (num <= 1) {
        return num == 1;
    }
    long i = 1;
    for( ; i*i < num; i++);
    return i*i == num;
}


03 第二種解法

使用二分查詢,起點為1,終點為num,取兩數中間值,然後判斷平方是否等於num,如果大了,就把終點指向當前中間值減1;如果小了,就把起點指向當前中間值加1。

此解法中,為了防範溢位的風險,使用了long型別的變數。

public boolean isPerfectSquare2(int num) {
    if (num <= 1) {
        return num == 1;
    }
    long start = 1;
    long end = num;
    while (start <= end) {
        long mid = (start+end)/2;
        if (mid*mid == num) {
            return true;
        }
        if (mid*mid < num) {
            start = mid + 1;
        }
        if (mid*mid > num) {
            end = mid -1;
        }
    }
    return false;
}


04 第三種解法

使用牛頓迭代法,核心程式碼是:

x*x = num
x = num/x
2*x = x + num/x
x = (x + num/x)/2

對於x的初始值,我們取num的值,迴圈的判斷條件是x的平方大於num,最後判斷x的平方是否等於num。

public boolean isPerfectSquare3(int num) {
    long x = num;
    while (x*x > num) {
        x = (x + num / x) / 2; 
    }
    return x*x == num;
}


05 第四種解法

此題其實就是判斷num能否被開平方且結果是整數。如1,4,9,16,25,36等,這些數字都是可以,。同樣,我們可以觀察一組奇數之和:

1 = 1

1+3 = 4

1+3+5 = 9

1+3+5+7 = 16

1+3+5+7+9 = 25

1+3+5+7+9+11 = 36

n個奇數(1,3,5,7,...)之和等於n的平方,其中n大於0。

對此,我們可以對num做減法,每次減去一個奇數,最後判斷是否等於0。

public boolean isPerfectSquare4(int num) {
    int i = 1;
    while (num > 0) {
        num -= i;
        i += 2;
    }
    return num == 0;
}


06 小結

演算法專題目前已連續日更超過兩個月,演算法題文章77+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!