题目要求:
求一个非负数的平方根,精确到整数位。
Problem Description:
Given a non-negative integer x
, compute and return the square root of x
.
Since the return type is an integer, the decimal digits are truncated, and only the integer part of the result is returned.
Note: You are not allowed to use any built-in exponent function or operator, such as pow(x, 0.5)
or x ** 0.5
.
思路:
变相的二分查找问题,将查找数组限定为 [0 : x//2+2]。
首先,将数组中间位置的值的平方和x比较,如果两者相等则输出;否则利用中间位置将数组分成前、后两个子数组,如果中间位置的平方值大于x,则进一步查找前一子数组,否则进一步查找后一子数组。
重复以上过程,直到找到x或直到子数组只有1个数字,此时直接输出子数组下届。
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
left = 0
right = x//2 + 2
while left < right - 1:
mid = (left + right)//2
if mid**2 > x:
right = mid
elif mid**2 < x:
left = mid
else:
return mid
return left
结果如下:
二分查找:
二分查找又称折半查找,它是一种效率较高的查找方法。二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。
本质上是一个不断缩小搜索空间的过程。