LeetCode 之 JavaScript 解答第69题 —— X 的平方根(Squrt(x))

Time:2019/4/17
Title: sqrt(x)
Difficulty: Easy
Author: 小鹿

题目:sqrt(x)

Implement int sqrt(int x).

Compute and return the square root of x, where x is guaranteed to be a non-negative integer.

Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.

完成
int sqrt(int x) 函数。

盘算并返回 x 的平方根,个中 x 黑白负整数。「」

由于返回范例是整数,效果只保存整数的部份,小数部份将被舍去。

Example 1:

Input: 4
Output: 2

Example 2:

Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since 
             the decimal part is truncated, 2 is returned.

Solve:

▉ 题目剖析

1)依据题目请求,求一个指定树的平方根,第一要想到的是开平方根是没有规律可循的,能够想到一个暴力破解法,从 1 最先遍历,直到满足
k^2 < x
(k+1)^2 > x 为止。

2) 你能够想到这类要领效力太低,须要从 1 最先,假如 x 很大,岂不是须要遍历许多?能不能划定一个局限,在这个局限中查找开平方根呢?你会想到,一切数的开平方根获得的值是永久小于即是本身的(0 是本身),所以 x 的开平方根的值的局限一定在 0 < k < x 之间。

3)要想在这个区间疾速定位找到一个满足前提的 x ,最高效的要领莫过于二分查找,然则能够存在小数,这又涉及到二分查找的四个变体(二分查找的变形)历程。假如你之前没有连接过,没紧要,请看我之前纪录的一篇文章。

4)虽然我们已肯定了解题要领,然则这时候不要焦急,想想这个题目是不是满足二分查找的四个实用前提?哪四个前提呢?你须要体系进修一下就 ok !

▉ 算法思绪

1)此历程分为两种状况,负数和正整数,所以要对输入的 x 举行推断。

2)然后最先依据二分查找应当注重的「三个重点」写出无 bug 的代码。

3)对二分查找举行轻微的变体,由于我们能够查找的数并非一个正整数,我们取整数部份就能够了,小数部份省略。

▉ 测试用例

1)输入 0

2)输入1

3)输入负数的 x

4)输入平方根为正整数的 x

5)输入平方根为小数的 x

▉ 代码完成

写二分查找代码须要注重的三点:

1)轮回退出前提。

2)mid 的取值。

3)low 和 hight 的更新。

var mySqrt = function(x) {
     let low = 1;
     let high = x;
     // 假如 x 小于 0 输出 -1
     if(x < 0) return -1;
     // 轮回停止前提
     while(low <= high){
        // mid 取值
        let mid = Math.floor(low + ((high - low)/2));
        // 推断平方是不是小于即是
        if(Math.pow(mid,2) <= x){
            // 假如小于即是,假如下一值大于 x 则当前值为 x 平方根的最小整数值
            if(Math.pow(mid+1,2) > x || mid === high){
                return mid;
            }else{
                low = mid + 1;
            }
        }else{
            high = mid - 1;
        }
    }
    return 0;
};
▉ 机能剖析

暴力破解:

  • 时候复杂度:O(n)。你须要从 1 遍历一切能够的数据,所以时候复杂度为O(n)。
  • 空间复杂度:O(1)。不须要分外的内存空间。

二分法:

  • 时候复杂度:O(n)。每次都折半查找,所以查找一个元素时候复杂度为O(logn)。
  • 空间复杂度:O(1)。不须要分外的内存空间。
▉ 小结

经由过程这个题我们能够总结一下:

1)假如题目涉及到查找,我们要想到运用二分查找来进步效力。

2)运用二分查找之前,推断题目是不是满足二分查找的请求。

迎接一同加入到 LeetCode 开源 Github 堆栈,能够向 me 提交您其他言语的代码。在堆栈上对峙和小伙伴们一同打卡,配合完美我们的开源小堆栈!

Github:
https://github.com/luxiangqia…

迎接关注我个人民众号:「一个不甘寻常的码农」,记录了本身一起自学编程的故事。

    原文作者:小鹿
    原文地址: https://segmentfault.com/a/1190000018916873
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞