这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战。
题目描述:
367. 有效的完全平方数 - 力扣(LeetCode) (leetcode-cn.com)
给定一个 正整数 num
,编写一个函数,如果 num
是一个完全平方数,则返回 true
,否则返回 false
。
进阶:不要 使用任何内置的库函数,如 sqrt
。
示例一
输入: num = 16
输出: true
复制代码
示例二
输入: num = 14
输出: false
复制代码
提示:
1 <= num <= 2^31 - 1
思路分析
暴力
这个没什么好说的,如果 num
是完全平方数, 那么一定存在一个整数
使得
,我们只要从1开始遍历即可。
二分查找
上面的暴力查找我们稍微优化下就可以想到二分查找法,我们知道
,所以我们只要将 1
和 num
作为二分查找的边界即可。
AC代码
class Solution {
fun isPerfectSquare(num: Int): Boolean {
var left = 0L
var right = (num / 2).toLong() + 1
var target = num.toLong()
while (left <= right) {
val mind: Long = (left + right) / 2
val square = mind * mind
when {
square == target -> return true
square < target -> left = mind + 1
else -> right = mind - 1
}
}
return false
}
}
复制代码
总结
看了官解,还有牛顿迭代法,说实话已经看到好几次这个解法了,但一直没有去看下,今天好好看了下,感觉又回到学校在学习数学知识,希望下次能融会贯通用上。
还有神奇的 通项公式法 367.有效的完全平方数——通项公式法 - 有效的完全平方数 - 力扣(LeetCode) (leetcode-cn.com)
参考
有效的完全平方数 - 有效的完全平方数 - 力扣(LeetCode) (leetcode-cn.com)
367.有效的完全平方数——通项公式法 - 有效的完全平方数 - 力扣(LeetCode) (leetcode-cn.com)
【宫水三叶】一题双解 :「二分」&「数学」 - 有效的完全平方数 - 力扣(LeetCode) (leetcode-cn.com)