LeetCode 69 这道题是求正整数的平方根,就是求 √x 的值,由于 y = √x 是一个单调递增的函数,因此可以
用二分查找法来查找结果。
class Solution:
def mySqrt(self, x: int) -> int:
l = 1
r = x
if x == 0 or x == 1:
return x
while(l<=r):
mid = int(l + (r-l)/2) # 这里也可以用位运算加快速度 mid = l + r >> 1 ,由于+的优先级高于>>,所以括号可以不加
if mid == x/mid:
return mid
if mid < x/mid:
l = mid + 1
res = mid # 注意这个地方是在mid<x/mid的时候,更新res,因为题目要求的是返回一个整数,那么意味着返回的整数必然小于等于该有的结果.
if mid > x/mid:
r = mid - 1
return res
# 如果题目要求答案要求向上取正的话就把上述代码的res放到 if mid > x/mid 内部,这样实现从右侧不断逼近真实值,即向上取整,
# 而把res放在 if mid < x/mid 内部,这样实现从左侧不断逼近真实值,即向下取整,而能取整是因为每次mid的增加都是以1为单位并且mid也是一个整数
可以设置精度的sqrt()函数
class Solution:
def mySqrt(self, x: int) -> int:
if x == 0 or x == 1:
return x
l = 1
r = x
while(abs(l-r)>=0.00001): # 精度为10的-5次方
mid = (l + (r-l)/2) # 这种情况下的mid就要保持它是浮点数
if mid == x/mid:
return mid
if mid < x/mid:
l = mid # 这次的l不需要置为mid+1了,因为此时mid每一次的增加的单位不再是1了,之前表示数组下标或者整数的时候,每次加一。
res = mid
if mid > x/mid:
r = mid
return res
LeetCode 367. 有效的完全平方数
此题就是 69 题的反过程,也是由于 y = √x 是一个单调递增的函数,因此可以用二分查找法来查找结果。
class Solution:
def isPerfectSquare(self, num: int) -> bool:
if num == 1 or num == 0:
return True
l = 1
r = num
while(l<=r):
mid =int( l + (r - l)/2 )
if mid == num/mid:
return True
elif mid < num/mid:
l = mid + 1
elif mid > num/mid:
r = mid - 1
return False