leetcode-question69 x的平方根

題目描述

實現 int sqrt(int x) 函數。
計算並返回 x 的平方根,其中 x 是非負整數。
由於返回類型是整數,結果只保留整數的部分,小數部分將被捨去。
示例 1:

輸入: 4
輸出: 2

示例 2:

輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842…,
由於返回類型是整數,小數部分將被捨去。

思路

解法1

遍歷1到x/2的數,注意判斷是不要用 “i*i == x” 這種,因爲會溢出。

解法2

在解法1的基礎上調整爲二分查找法,降低時間複雜度

解法3

百度搜索得到的方法,牛頓迭代法

代碼

解法1

class Solution {
    /**
     * 遍歷1到x/2的數,注意判斷是不要用 “i*i == x” 這種,因爲會溢出。
     */
    public int mySqrt(int x) {
       if(x ==1 || x == 0){
            return x;
        }
        int halfX = x / 2;
        int ret = 0;
        for(int i = 1; i <= halfX; ++ i){
            if(i <= x / i && (i+1) > x / (i + 1)){
                ret =  i;
                break;
            }  
        }
        return ret;
    }
}

解法2

class Solution {
    /**
     * 在解法1的基礎上調整爲二分查找法,降低時間複雜度
     */
    public int mySqrt(int x) {
        if(x <= 1){
            return x;
        }
        int ret = 0;
        int start = 0;
        int end = x;
        while(start  < end){
            int mid = start + (end - start) / 2;
            if(mid <= x / mid) 
                start = mid + 1;
            else
                end = mid;
        }
        return end - 1;
    }
}

解法3

class Solution {
    /**
     * 牛頓迭代法,同樣避免 ret * ret = x的判斷條件
     */
    public int mySqrt(int x) {
        if(x == 0){
            return x;
        }
        long ret = (long)x;
        while(ret  > x / ret){
            ret = (ret + x/ret) / 2;
        }
        return (int)ret;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章