前言
大家都睡了吗?还没睡的话来道简单题睡前助眠吧🐶🐶
题目描述
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
示例 1:
输入:16
输出:True
示例 2:
输入:14
输出:False
解题思路
题目要求判断给定的正整数num是完全平方数。
首先我们先来回顾下完全平方数的定义:
完全平方指用一个整数乘以自己例如11,22,3*3等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。完全平方数是非负数,而一个完全平方数的项有两个。注意不要与完全平方式所混淆。完全平方数。
然后我们可以大概想到这道题的集中解法:
暴力解法
我们直接用for循环,在num一半的范围内以此类推判断是否满足条件,满足则返回true,反之则返回false。
二分法
用left = 1, right = num来表示左右两端点,然后取left和right的中间值mid=parseInt((left+right)/2),用temp = mid * mid来和num做比较,temp > num的话,表示超出范围,则mid--,反之则mid++,temp == num的话则返回true,以此类推。
数理法
任意一个平方数都可以表示出下面的奇数序列和:
1+3+5+7+...+(2N−1)=N^2
依据数理规律即可。
牛顿迭代
依据下列公式:
x= (x+tmp_x/x)/2
解题代码
暴力
var isPerfectSquare = function(num) {
if(num == 1) return true;
const mid = num / 2;
for(let i = 1; i <= mid; i++){
if(i*i == num){
return true;
}
}
return false;
}
二分法
var isPerfectSquare = function(num) {
if(num == 1) return true;
let left = 1,right = num;
while(left <= right){
let mid = parseInt((left+right)/2);
let temp = mid*mid;
if(temp == num){
return true;
}else if(temp > num){
right = mid-1;
}else{
left = mid+1;
}
}
return false;
}
数理法
var isPerfectSquare = function(num) {
let i = 1;
while(num > 0) {
num -= i;
i += 2;
}
return num == 0;
}
牛顿迭代法
var isPerfectSquare = function(num) {
if(num == 1){
return 1;
}
var tmp = num;
while(num*num > tmp){
num = (num+tmp/num)/2 | 0;
}
return num*num == tmp;
};
刷题打卡记录
这里是之前的刷题打卡记录,大家有兴趣的可以看下,如果有什么不同的见解和看法或者觉得有什么错误的,欢迎在评论区留言!🙏🙏🙏
[LeetCode0303题区域和检索 - 数组不可变] | 刷题打卡
[LeetCode0304题二维区域和检索 - 矩阵不可变] | 刷题打卡
[LeetCode236题二叉树的最近公共祖先] | 刷题打卡
[LeetCode1124题表现良好的最长时间段] | 刷题打卡
总结
加油!hxdm!!!💪💪💪
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情