LeetCode.367 有效的完全平方数

390

这是我参与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 是完全平方数, 那么一定存在一个整数 xx 使得 xx=numx ✖ x = num,我们只要从1开始遍历即可。

二分查找

上面的暴力查找我们稍微优化下就可以想到二分查找法,我们知道 1xnum1≤x≤num,所以我们只要将 1num 作为二分查找的边界即可。

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)