vlambda博客
学习文章列表

x 的平方根(二分查找)

原题描述

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

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

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

原函数

1int mySqrt(int x) {
2
3}
 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

实现代码

 1int mySqrt(int x)
2{
3    if (x < 2)
4        return x;
5
6    long left = 0right = x, mid = 0;
7    while (left <= right)
8    {
9        mid = (left + right) / 2;
10        if (mid * mid == x)
11            return (int)mid;
12
13        else if (mid * mid < x)
14            left = mid + 1;
15
16        else
17            right = mid - 1;
18    }
19    return (int)right;
20}

作这题时第一时间想到的是利用 for 来逐个寻找根数,但很快就被否决了。因为 for 的时间复杂度为 o(n),而且迭代步长如果很小的话,具体的运行时间也会大幅增加;如果步长稍微大一点,那么答案就很大几率会出错;所以多种情况综合考虑,还是使用了二分查找。


二分查找时间复杂度为 O(logn),明显比用 for 逐个循环要好得多,而且找到的结果更加准确。


二分查找类似递归,想要写好二分查找就要找准结束条件,这一题中的结束条件就是最小值不大于最大值。


之前也有 leetcode 题是介绍的二分查找和递归的,可以看推荐阅读。


推荐阅读