【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

*解法四:

最简洁,没有之一

扫描二维码关注公众号,回复: 4176972 查看本文章
var isPerfectSquare = function(num) { 
    for(var i=1; i<= num/i; i++){
            if(i*i == num) return true
        }
    return false
};

68 / 68 个通过测试用例
执行用时:84 ms

猜你喜欢

转载自blog.csdn.net/sphinx1122/article/details/84195109