算法学习第六天

183 阅读1分钟

  今天来一道数字题,就是leetcode的第367题-有效的完全平方数。因为题目比较简单,直接上题目:

给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如  sqrt。

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

  题意就是不能使用内置库函数,通过自行编写方法验证该数是否是完全平方数。下面写两种解决方法:
  第一种,使用前两天分享过的二分法,不断地在中间范围查找,验证是否存在一个数通过平方能和目标相等。如果存在说明目标是完全平方数,否则不是。

var isPerfectSquare = function(num) {
    if (num == 1) return true
    let l = 0, r = num / 2
    while (l <= r) {
        const mid = (l + r) >>1
        if (mid * mid == num) return true
        if (mid * mid < num) {
            l = mid + 1
        } else {
            r = mid - 1
        }
    }
    return false
};

  第二种,数字公式-牛顿迭代法。说实话,这个需要看着牛顿迭代法的推导公式才能大概看懂,才能理解为什么可以这样做。

var isPerfectSquare = function(num) {
    if (num == 1) return true

    let x = num / 2;
    while(!( x * x <= num && (x + 1) * ( x + 1) > num)){
        x = parseInt(x-(x*x-num)/(2*x))
    }
    return (x * x == num);
};

  还有一种是遍历1到num的整数,进行自身相乘,看会不会和目标相等,如果和目标相等,说明目标是完全平方数;否则不是。不过这种时间复杂度是O(n)的,相比第一种的时间复杂度O(log n)要高,就不贴代码了。
  验证了一句话,当物理学家学到高深了就变数学家了,当计算机学家学到高深了就变成数学家了。