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+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!