1、题目描述
https://leetcode-cn.com/problems/sqrtx/
实现 int sqrt(int x)
函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
2、代码详解
思路:binary search(二分查找)
改进版推荐代码
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
if x == 1:
return 1
l = 0
r = x//2 + 1 # 优化
# (1)r = x//2 注意:必须r = mid-1、l = mid+1
# 原因 x = 2 时,r = x // 2 容易造成 mid = 0+(1-0)//2 = 0,所以 r = mid、l = mid 写法不可以
# (2)r = x//2 + 1 和 r = x 这两种写法 r = mid-1、l = mid+1 或 r = mid、l = mid 两种写法都行
while l <= r:
mid = l + (r - l)//2
if mid * mid <= x < (mid+1)*(mid+1): # 等号至关重要
return mid
elif x < mid * mid:
r = mid - 1
elif x > mid * mid: # 这个逻辑必须在第一个分支之后兜底
l = mid + 1
x = 2 # 特殊case,r = x // 2 容易造成 mid = 0+(1-0)//2 = 0
# x = 100
s = Solution()
print(s.mySqrt(x))
注意事项
- 特例x = 2,容易造成mid = 0,注意写法
- 优化:对于一个非负数n,它的平方根不会大于(n/2+1),所以 r = x//2 + 1
思路来源于一下代码
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
if x==1: return 1
l, r = 0, x
while l <= r:
mid = (r+l)//2
if mid * mid <= x < (mid+1)*(mid+1):
return mid
elif x < mid * mid:
r = mid
else:
l = mid
https://leetcode-cn.com/problems/sqrtx/solution/wu-xu-pan-duan-ge-chong-bian-jie-yue-jie-qing-kuan/