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)使用二分查找以前,判斷問題是否知足二分查找的要求。