Time:2019/4/17
Title: sqrt(x)
Difficulty: Easy
Author: 小鹿javascript
Implement int sqrt(int x)
.java
Compute and return the square root of x, where x is guaranteed to be a non-negative integer.git
Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.github
实现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.
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)输入 02)输入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)使用二分查找以前,判断问题是否知足二分查找的要求。