这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战
leetcode-367-有效的完全平方数
[博客链接]
[题目链接]
[github地址]
暂时还没有哦周末更新地址
[题目描述]
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt 。
示例 1:
输入:num = 16
输出:true
示例 2:
输入:num = 14
输出:false
提示:
思路一:二分查找
- 题目分析起来没什么特别需要讲解的
- 这种大概第一时间都会想到二分查找
- 唯一需要注意的点可能是二分判断条件上界可能会超出整型值,所以需要用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不断的进行减法,减掉连续奇数即可
- 减掉连续奇数即可满足获得最终想要的是否是完全平方数
class Solution {
public boolean isPerfectSquare(int num) {
int x = 1;
while (num > 0) {
num -= x;
x += 2;
}
return num == 0;
}
}
- 时间复杂度O()
- 空间复杂度O(1)
昨天的题太难了我实在是不太想写,看题解都很难理解,我建议大家如果非常想a一个sp的offer可以直接看一下题解,如果无所谓的,感兴趣的背一下就可以了