leetcode每日一题系列-有效的完全平方数-「二分」-「数学」

324 阅读1分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

leetcode-367-有效的完全平方数

[博客链接]

菜🐔的学习之路

掘金首页

[题目链接]

题目链接

[github地址]

暂时还没有哦周末更新地址

[题目描述]

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

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

 

示例 1:

输入:num = 16
输出:true

示例 2:

输入:num = 14
输出:false

提示:

1<=num<=23111 <= num <= 2^{31} - 1

思路一:二分查找

  • 题目分析起来没什么特别需要讲解的
  • 这种大概第一时间都会想到二分查找
  • 唯一需要注意的点可能是二分判断条件上界可能会超出整型值,所以需要用long
class Solution {
    public boolean isPerfectSquare(int num) {
           long l = 0, r = num;
            while (l < r) {
                long mid = (long)(l - r + 1) / 2 + r;
                if (mid * mid == num) {
                    return true;
                }
                if (mid * mid < num) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
            return l * l == num;
    }
}
  • 时间复杂度O(lgn)
  • 空间复杂度O(1)

思路二:数学

  • 除了上述正常思路的二分也可以使用数学方式分析出来
  • 数学规律可以发现一个完全平方数可以写成连续奇数和
  • 也就是说nums需要满足 num=n2=1+3+5+7+9num = n^2 = 1 + 3 +5 + 7 + 9 ···
  • 因此我们可以对num不断的进行减法,减掉连续奇数即可
  • 减掉连续奇数即可满足获得最终想要的是否是完全平方数
class Solution {
    public boolean isPerfectSquare(int num) {
        int x = 1;
        while (num > 0) {
            num -= x;
            x += 2;
        }
        return num == 0;
    }
}
  • 时间复杂度O(n\sqrt{n})
  • 空间复杂度O(1)

昨天的题太难了我实在是不太想写,看题解都很难理解,我建议大家如果非常想a一个sp的offer可以直接看一下题解,如果无所谓的,感兴趣的背一下就可以了