題目
連結
LeetCode 367[有效的完全平方數]
詳情
例項
提示
題解
思路
求算術平方根,逐漸遍歷的話,數值小應該是沒問題的,但是數值大的話時間應該會超出限制
本質是:給定一個數字,在範圍內找一個數字的平方為該數,找到了則輸出ture,找不到則輸出false
轉換一個思路,即給定一個數字,在範圍內找出該數,也就是查詢問題,最基本的方法就是二分查詢
初始值設定最小值 iMin 為 0,最大值 iMax 為給定值 num
開始迴圈:
求取中間值 iMid = (iMin + iMax) / 2
取中間值的平方 iMul = iMid * iMid
若 iMul 等於 num,則可以找著算術平方根,即返回 true
若 iMul > num,即 iMid > sqrt(num),即所求值小於 iMid,需要在 iMin 到 iMid -1 範圍中查詢,即 iMax = iMid - 1
若 iMul < num,即 iMid < sqrt(num),即所求值大於 iMid,需要在 iMid + 1 到 iMax 範圍中查詢,即 iMin = iMid + 1
繼續執行迴圈,直到 iMin > iMax,退出迴圈,此時為找不到算術平方根,故返回false
程式碼
class Solution {
public:
bool isPerfectSquare(int num) {
int iMin = 0;
int iMax = num;
while (true)
{
long long iMid = (iMin + iMax) / 2;
long long iMul = iMid * iMid;
if (num == iMul)
return true;
if (num > iMul)
iMin = iMid + 1;
else
iMax = iMid - 1;
if (iMin > iMax)
return false;
}
}
};