LeetCode——69. x 的平方根

题目介绍

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

示例1:
输入: 4
输出: 2

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

题解思路

题乍一看,一个Math.sqrt()就可以解决,当我写完提交发现超过100%我就知道事情没那么简单,难道你面试就这样写?

其实题干的意思是自己编写sqrt方法,不要调用Math类的方法,当然这确实是一道比较简单的面试题,就看你自己的实现手法了

最早想到的就是直接一个一个的平方遍历,当然这是很暴力的手法,我们可以添加条件限制,范围给到从1到x/2 + 1即可

而且可以用二分查找算法来优化,当然这是正常的解法,官方题解中除此之外还给到一种另辟蹊径的计算方法,还提供了一种牛顿迭代法

这也许就是自己和算法大佬的差距吧,数学确实是一门优雅的学科,下面是代码演示

正确代码

class Solution {
    public int mySqrt(int x) {
        int l = 0;
        int r = x / 2 + 1;
        int ans = -1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (Math.pow(mid, 2) <= x) {
                ans = mid;
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return ans;
    }
}

总结

因为二分查找的缘故,时间复杂度为O(logn),代码和一般的二分查找基本一致,不存在生涩难懂的地方

一开始学习算法,经典的排序和查找算法就是我们必须所掌握的,他们蕴含的算法思想是我们工作和学习中值借鉴的

有机会自己要写一篇总结排序和查找算法的随笔,立一个flag先

文章如果存在问题或者有更好的题解,希望大佬斧正和评论,各自努力,你我最高处见
posted @ 2021-03-01 10:51  21岁还不是架构师  阅读(62)  评论(0编辑  收藏  举报