1. 程式人生 > >【JS】有效的完全平方數 #數學 #二分查詢

【JS】有效的完全平方數 #數學 #二分查詢

給定一個正整數 num,編寫一個函式,如果 num 是一個完全平方數,則返回 True,否則返回 False。
說明:不要使用任何內建的庫函式,如 sqrt。

示例 1:
輸入:16
輸出:True

示例 2:
輸入:14
輸出:False

示例 3:
輸入:808201
輸出:true
解釋: 899

解法一:

通過累加從1到大的數字乘積來判斷是不是大於或者等於目標數,等於返回ture,大於false。

var isPerfectSquare = function(num) { 
    for(var i=0;i>-1;i++){
        var square = i*i;
        if(square==num) return true;
        if(square>num) return false; 
    }
};

68 / 68 個通過測試用例
執行用時:84 ms


解法二:

與前面的方法一樣,只是減少了迴圈的次數,在測試用時上有明顯的區別,
需要注意的是,x==0要優先判斷,因為放那後面的話那程式就會每次都計算square*square的結果增加迴圈中的計算量

// 2018/11/17 Sat 晚上
var isPerfectSquare = function(num) {
    var x=0;
    for(var i=0;i>-1;i++){
        var square = i*i;
        if(square>=num) break ;
        if(x==0 && square*square<num){
            i=i*i;
        }else{
            x=1
        }
    }
    return square==num?true:false    
};

68 / 68 個通過測試用例
執行用時:64 ms

解法三:

二分查詢法,先找到最中間的數字,目標值大於中間的數,則在中間值與最高值之間找,目標值小於中間數,則在最低與中間之中找,通過不過折半最終找到目標值。較低的值每次拆半都加1,而較高的值每次都減1,當兩個數大小超過臨界了就返回false。

// 2018/11/17 晚上
var isPerfectSquare = function(num) { 
    var low=1,hig=num,mid;
    while (low<=hig) {
        mid=Math.ceil((low+hig)/2)
        if(mid*mid==num) return true;        
        if(mid*mid<num){
            low=mid+1
        }else{
            hig=mid-1
        }
    }
    return false;
};

68 / 68 個通過測試用例
執行用時:84 ms

*解法四:

最簡潔,沒有之一

var isPerfectSquare = function(num) { 
    for(var i=1; i<= num/i; i++){
            if(i*i == num) return true
        }
    return false
};

68 / 68 個通過測試用例
執行用時:84 ms