LeetCode 0069. Sqrt(x) x 的平方根【Easy】【Python】【二分】
Problem
Implement int sqrt(int x)
.
Compute and return the square root of x, where x is guaranteed to be a non-negative integer.
Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.
Example 1:
Input: 4
Output: 2
Example 2:
Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since
the decimal part is truncated, 2 is returned.
问题
实现 int sqrt(int x)
函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
思路
法一:
二分查找
典型的二分题目。注意返回值要是整数。
法二:
牛顿迭代法
详情可以看这篇文章:牛顿迭代法快速寻找平方根。
令f(res) = res^2 - x,则sqrt(x)等价于求f(res)的根
初始假设答案 res = x
每一次迭代,令 res = (res + x / res) / 2
新的 res 值为当前 res 值对应的函数切线与 x 轴的交点横坐标,这就是牛顿迭代的本质。
法三:
直接用库函数。
时间复杂度: O(logn)
空间复杂度: O(1)
Python代码
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
# solution one: binary search
low, high, mid = 0, x, x / 2
while low <= high:
if mid ** 2 > x:
high = mid - 1
else:
low = mid + 1
mid = (low + high) / 2
return int(mid)
# # solution two: Newton's method
# res = x
# while res * res > x:
# res = (res + x / res) / 2
# return int(res)
# # solution three: math
# import math
# return int(math.sqrt(x))