今天来一道数字题,就是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)要高,就不贴代码了。
验证了一句话,当物理学家学到高深了就变数学家了,当计算机学家学到高深了就变成数学家了。