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


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


題目:sqrt(x)

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.

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... 歡迎關注我我的公衆號:「一個不甘平凡的碼農」,記錄了本身一路自學編程的故事。
相關文章
相關標籤/搜索