[LeetCode367题有效的完全平方数] | 刷题打卡

481 阅读3分钟

前言

大家都睡了吗?还没睡的话来道简单题睡前助眠吧🐶🐶

题目描述

367. 有效的完全平方数

给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。

说明:不要使用任何内置的库函数,如  sqrt。

示例 1:

输入:16
输出:True

示例 2:

输入:14
输出:False

解题思路

题目要求判断给定的正整数num完全平方数

首先我们先来回顾下完全平方数的定义:

完全平方指用一个整数乘以自己例如11,22,3*3等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。完全平方数是非负数,而一个完全平方数的项有两个。注意不要与完全平方式所混淆。完全平方数

然后我们可以大概想到这道题的集中解法:

暴力解法

我们直接用for循环,在num一半的范围内以此类推判断是否满足条件,满足则返回true,反之则返回false

二分法

left = 1, right = num来表示左右两端点,然后取leftright的中间值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题区域和检索 - 数组不可变] | 刷题打卡

[LeetCode1200. 最小绝对差] | 刷题打卡

[LeetCode0304题二维区域和检索 - 矩阵不可变] | 刷题打卡

[LeetCode11题盛最多水的容器] | 刷题打卡

[LeetCode0338题比特位计数] | 刷题打卡

[LeetCode209题长度最小的子数组] | 刷题打卡

[LeetCode236题二叉树的最近公共祖先] | 刷题打卡

[LeetCode141题环形链表] | 刷题打卡

[LeetCode53题最大子序和] | 刷题打卡

[LeetCode48题旋转图像] | 刷题打卡

[LeetCode155题最小栈] | 刷题打卡

[LeetCode1124题表现良好的最长时间段] | 刷题打卡

[LeetCode274题H指数] | 刷题打卡

总结

加油!hxdm!!!💪💪💪

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情