判斷平方數
1、問題描述
給定一個正整數num ,判斷是否爲完全平方數,要求當num爲完全平方數時返回True,否則返回False。
2、問題示例
輸入num=16,輸出True,sqrt(16)=4;輸入num=15,輸出False,sqrt(15)=3.87。
3、代碼實現
# 參數 num 是一個正整數
# 返回值時一個布爾值,如果num是完全平方數就返回True,否則返回False。
class Solution():
def isPerfectSquare(self, num):
l = 0
r = num
while (l - r > 1): # 當左值l 與右值r 是非相鄰數字時:
mid = ( l + r ) / 2 # 取中值
if (mid * mid <= num): # 如果mid的平方數小於或者等於num,表示我們要找的數比這個數大
l = mid # 縮小範圍,爲了尋找更大的數
else: # 如果mid的平方數大於num,表示我們要找的那個數比這個數小
r = mid # 爲了尋找更小的數
ans = l # 如果存在mid*mid=num,則會將mid賦值給l,所以ans的初始值爲l
if (l * l < num): # 但如果l*l的值小於num,代表我們要找的數可能是r
ans = r
return ans * ans == num # 如果找到了平方數,則返回True
if __name__ == '__main__':
num = 16
print("initial value: ", num)
solution = Solution()
print("result: ", solution.isPerfectSquare(num))
4、運行結果
initial value: 16
result: True
5、分析
本人覺得這個算法可能包含兩種思維:1、二分法;2、極限
- 二分法:取中值的方法可以更快地進行序列查找。
- 極限:作爲二分查找的終止條件,當二分法左右兩個基數的距離小於1時,題目所需的正整數已經被遍歷完畢。
求平方根
1、問題描述
實現 int sqrt(int x)函數,計算並返回 x 的平方根。
2、 問題示例
sqrt(3) = 1; sqrt(4) = 2; sqrt(5) = 2; sqrt(10) = 3;
3、代碼實現
class Solution():
def _sqrt(self, x):
# 設置左右兩個數 分別爲0與x
l, r = 0, x
# 循環直至 l 與 r 是相鄰的兩個數
while l + 1 < r:
# 地板除 向下取整 m爲中位數
m = (r + l) // 2
if m * m == x:
return m
# 如果m的平方大於x,代表我們要找的數在m左方
elif m * m > x:
# 所以將右邊的數賦值爲m,縮小範圍
r = m
else:
l = m
# 退出循環時,l與r爲相鄰的數。
if l * l == x:
return l
if r * r == x:
return r
# 如果都不是則取l返回(一定小於x)
return l
if __name__ == '__main__':
temp = Solution()
x1 = 16
x2 = 10
print("輸入:" + str(x1))
print("輸出:" + str(temp._sqrt(x1)))
print("輸入:" + str(x2))
print("輸出:" + str(temp._sqrt(x2)))