[东哥的leetcode刷题日记] leetcode 69 : Sqrt(x)

leetcode 69 : Sqrt(x)


题目链接: https://leetcode-cn.com/problems/sqrtx/
难度: 简单
归类 : 数组操作, 二分查找

题目:

实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例:

示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。


解法:

主要使用python进行了解答,以及经典题解和尝试改进的最优/最简洁解法。


个人解法

二分查找法进行求解,设置start = 1, end = x/2 + 1(防止4)。
设置中值mid = start + (end - start) / 2

终止条件为:

#即当(mid刚好是根时)或者(刚好mid*midx)
if x / mid == mid or (x/mid > mid and x/(mid+1) < (mid+1)):
    return mid

python解法

#python解法
class Solution:
    def mySqrt(self, x: int) -> int:
        if x < 2:
            return x
        start = 1
        end = x // 2 + 1
        while start < end:
            mid = start + (end - start) // 2
            if x / mid == mid or (x/mid > mid and x/(mid+1) < (mid+1)):
                return mid
            elif x/mid > mid:
                start = mid
            else:
                end = mid
        return -1

时间复杂度: O(logN)
空间复杂度: O(1)
提交结果:
执行用时 :56 ms, 在所有 Python3 提交中击败了40.98%的用户
内存消耗 :13.6 MB, 在所有 Python3 提交中击败了6.06%的用户


题解优解

牛顿迭代法可以快速求解本问题,需要一定的数学基础才能想到。
牛顿迭代法求平方根的原理可见:https://blog.csdn.net/u014485485/article/details/77599953

#c++解法
class Solution:
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x <= 1:
            return x
        r = x
        while r > x / r:
            r = (r + x / r) // 2
        return int(r)

时间复杂度: O(logN)
空间复杂度: O(1)
提交结果:
执行用时 :52 ms, 在所有 Python3 提交中击败了53.59%的用户
内存消耗 :13.6 MB, 在所有 Python3 提交中击败了6.06%的用户


尝试改进的最优解法

本题使用暴力法,二分查找法,牛顿迭代法均可实现

你可能感兴趣的:(东哥的leetcode刷题日记)