题目
分析
x的平方根一定小于等于x(如果x等于1 则是等于)。所以可以从1到x的数遍历,这样的话复杂度是O(n)。
既然是有序数组的查找,自然可以使用二分法来找数,每次选到的mid值如果mid的平方比x小,说明平方大于等于x的数在mid+1之后,此时让l=mid+1。如果mid的平方大于等于x,说明mid有可能就是第一个平方大于等于x的位置,此时让r=mid。
最后当l==r时退出查找,判断r**2==8还是r**2>8来分别输出r或者r-1。
题目
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
if x <=0: return 0
if x == 1: return 1
l = 1
r = x
while l<r:
mid = (l+r)>>1
if mid**2<x:
l = mid+1
else:
r = mid
if r**2==x:
return r
else:
return r-1