【JS】有效的完全平方數 #數學 #二分查詢
阿新 • • 發佈:2018-11-21
給定一個正整數 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