leetcode系列之x的平方根

237 阅读1分钟

1.题目描述

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

2.示例

示例 1:

输入:x = 4
输出:2

示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

提示:

0 <= x <= 231 - 1

3.题解

3.1 遍历查找

最开始的想法就是从0到x之间的每一个数字都代入进去进行计算,判断是否为x的平方根,若是则返回

class Solution:
    def mySqrt(self, x: int) -> int:
        if x == 0:
            return 0
        for i in range(x+1):
            if i*i == x:
                return i
            if i*i < x and (i+1) * (i+1) > x:
                return i

result:

image-20220611154137913.png

3.2 缩短遍历范围进行查找

这个办法是在之前遍历查找的基础上做了一些改进,排除了0和1这2个平方根为本身的特殊数字。然后将遍历范围从[0,x]缩短至[0, x//2]或[0, x//2+1]。从而减少时长

class Solution:
    def mySqrt(self, x: int) -> int:
        if x == 0:
            return 0
        if x == 1:
            return 1
        m = x if x % 2 ==0 else x+1
        for i in range(m//2+1):
            if i*i == x:
                return i
            if i*i < x and (i+1) * (i+1) > x:
                return i

result:

image-20220611154154101.png

3.3 二分查找

这个是在前面3.2的缩短一侧的基础上,从两侧进行范围缩小。

class Solution:
    def mySqrt(self, x: int) -> int:
        start, end = 0, x
        while start < end:
            mid = (start + end + 1) >> 1
            if mid * mid <= x:
                start = mid
            else:
               end = mid - 1
        return star

result:

image-20220611163625639.png