4月更文d5n5-leetcode刷题69x的平方根

303 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

leetcode刷题69x的平方根

前文

本题目为leetcode查找类型题目,题目序号为69,题目难度为简单,题目链接为https://leetcode-cn.com/problems/sqrtx/,主要考察对于查找速度的优化。

题目信息

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

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

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

解题思路

根据题目要求,想查找某个数字的平方根,很容易想到直接利用函数操作。但由于题目不允许使用函数直接进行计算,因此我们很容易想到的解法是通过循环遍历的方式进行处理。从0开始进行遍历,遍历到目标的数字为止。而在此过程中,计算遍历中元素的值的平方。如果相等则为目标数字的平方根。这是一种很常见的想法。而本题目中采用了类似的遍历解法,只不过将遍历过程中的顺序遍历,进行一下优化修改为二分查找。每一次首先对于中间点的值进行计算,并确定下一段目标的区间。反复以此方式向前推进,便可逐渐缩小目标平方根所在的区间。直至确定某一个数值,它的平方恰好等于目标数值x,也就得到了x的平方根的大小。

解题代码

public int mySqrt(int x) {
    int p = 0;
    int q = x;
    int ans = 0;
    while (p <= q) {
        int mid = p + (q - p) / 2;
        if ((long) mid * mid <= x) {
            ans = mid;
            p = mid + 1;
        } else {
            q = mid - 1;
        }
    }
    return ans;
}

根据上述的解题代码进行一下简单分析,p和q分别代表目标区间的上下限。要做的也就是不停的利用p与q的值,计算中间位置的值,也就是mid。最终的结果是p与q与mid重叠,也就得到了目标的平方根答案。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。