有效的完全平方數(力扣第367題)

2022-06-16 11:48:11 字數 2163 閱讀 7833

題目:

給定乙個正整數 num,編寫乙個函式,如果 num 是乙個完全平方數,則返回 true,否則返回 false。

說明:不要使用任何內建的庫函式,如 sqrt。

分析:

這個題是乙個簡單題,通過迴圈能夠很容易的做出來,但是如果只用簡單的迴圈去判斷是否是完全平方數會超出時間限制,也就是說這樣的方式效能太低了。所以只能通過其他方式讓程式的執行更為快捷。

方法一:暴力迴圈,lue

public

boolean isperfectsquare(int

num)

int flag = 0;

int i = 2;

while (i <= (num/2))

else

if (i * i >num)

i++;

}if (flag == 1)

else

}

方法二:等差序列分析一下,完全平方數:0,1,4,9,16,25,36,……    它們之間的差值依次是1,3,5,7,9,11;這是乙個等差數列,用乙個**更加清晰的表示一下它們遞進的過程:

平方數 差值0

1 134

59716

92511……

可以看出,從第乙個完全平方數0開始,它加上第乙個差值1,就是下乙個完全平方數,依次類推,這些完全平方數之間的差值是乙個遞增的等差數列,而且會發現第i個完全平方數,其實就是前i-1個差值相加之後的結果,比如第3個完全平方數是4,那麼前兩個差值相加1+3就等於4。

根據這個規律我們可以讓num依次減去差值,最後判斷num是否等於0,等於0說明是完全平方數,不等於0,說明不是。差值初始值是1,每次遞增2;

public

boolean isperfectsquare4(int

num)

int sumnum = 1;

while (num > 0)

return (num == 0);

}

方法三:二分查詢分析可以,乙個大於2的完全平方數,其因子一定小於等於他的一半,那我們就設定兩個指標l和r,分別指向第乙個數和num/2,然後判斷mid = (l + r) /2 的平方是否和num相等,如果不等那就再具體分析,大於num就減少右指標,r = mid - 1,小於num就增加左指標,l = mid + 1,遍歷的整個過程如果沒有mid平方值和num相等的情況,那就說明不是完全平方。

public

boolean isperfectsquare3(int

num)

long r = num /2;

long l = 2;

while (l <=r)

else

if (mid * mid >num)

else

}return

false

;}

方法四:牛頓迭代法設定乙個函式f(x) = x2-num,當f(x) = x2-num = 0時,x這個根如何求?牛頓迭代法,就是不斷用這個二次函式的切線,不斷去逼近二次函式和x軸的交點。具體做法就是,先尋找一點xk ,

求出對應的函式值f(xk),然後求出在這一點處的二次函式的切線,這個是很好求,已經知道乙個點(xk,f(xk)),然後對二次函式求導,再將xk這個值帶入可以求出切線斜率,就可以求出這個切線的函式表示式了,然後令這個函式表示式等於0,求出切線和x軸交點,判斷是否等於二次函式和x軸交點,如果不等,就繼續上述操作,不斷逼近。

利用這一原理,我們就可以完成對乙個數是否是完全平方數進行判斷。設近似值為x,初始值設定為num/2,迴圈判斷x*x是否大於num,如果是那就不斷使用牛頓迭代法縮小近似值。具體的**實現如下:

public

boolean isperfectsquare2(int

num)

long x = num / 2;

while (x * x >num)

return (x * x ==num);

}

cyc2018;

367 有效的完全平方數

給定乙個正整數 num,編寫乙個函式,如果 num 是乙個完全平方數,則返回 true,否則返回 false。說明 不要使用任何內建的庫函式,如 sqrt。示例 1 輸入 16 輸出 true示例 2 輸入 14 輸出 false本題是在解決完我第一次刷題筆記中那道題之後推薦的題目,我看這兩題似乎很...

367 有效的完全平方數

題目 給定乙個正整數num,如果num是乙個完全平方數,返回true,否則返回false 法1 觀察到完全平方數1,4,9,16都是奇數的累加,比如1 1,4 1 3,9 1 3 5,16 1 3 5 7等等 def isperfectsquare self,num type num int rty...

367 有效的完全平方數

鏈結 給定乙個正整數 num,編寫乙個函式,如果 num 是乙個完全平方數,則返回 true,否則返回 false。說明 不要使用任何內建的庫函式,如 sqrt。示例 1 輸入 16 輸出 true示例 2 輸入 14 輸出 falsefunc isperfectsquare num int boo...