算法练习第47题-有效的完全平方数

172 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

一、题目

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

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

 

示例 1:

输入:num = 16
输出:true
示例 2:

输入:num = 14
输出:false

作者:力扣 (LeetCode) 链接:leetcode.cn/leetbook/re… 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二、思路

暴力解法

  • 当前解法比较简单,就是一个循环,通过循环遍历num,取其中的值做对比,
  • 判断条件是取到值的平方小于num
  • 如果小于num的话,那么left自增加一
  • 如果最后条件不成立的话,那么就返回False

内部函数

  • python的直接使用pow函数,然后在通过float.is_integer判断,如果为整数返回True,否则返回False
  • js的也是使用pow函数,不过下一步是通过向下取整,如果取整后的值和之前的值相同,那么就True,否则返回False

二分查找

  • 有题目可知,当前正整数num,应有两位相同的整数组成,如果存在这个数,则返回True,否则返回False
  • 那么,执行来看,首先相当的是二分查找,定义左右区间left, right, left = 0, right = num
  • 判断条件是当left小于等于right,定义中间值,由题意可知,应该是左右向中间移动,因此 mid = (left + right) // 2
  • //是向下取整的意思
  • 判断,如果取到的mid的平方等于num,那么返回True
  • 如果mid的平方大于num,那么说明取的mid取大了,那么右区间向左移动一位,也就是减一
  • 如果mid的平方小于num,那么说明取的mid取小了,那么左区间向右移动一位,也就是加一
  • 最后如果整个循环结束,并未返回True,那么说明num不是一个完全平方数,因此我们返回False

三、 代码

暴力解法

num = 16
class Solution:
    def isPerfectSquare(self, num: int) -> bool:
        """
        暴力解法
        当前解法比较简单,就是一个循环,通过循环遍历num,取其中的值做对比,
        判断条件是取到值的平方小于num
        如果小于num的话,那么left自增加一
        如果最后条件不成立的话,那么就返回False
        """
        left, sq = 1, 1
        while sq <= num:
            sq = left * left
            if sq == num:
                return True
            left += 1

        return False

Solution().isPerfectSquare(num)

使用内部函数

// js
let sq = Math.pow(num, 0.5)
return Math.floor(sq) === sq

// python
return float.is_integer(pow(num, 0.5))

二分查找

num = 14
class Solution:
    def isPerfectSquare(self, num: int) -> bool:
        """
        二分查找
        有题目可知,当前正整数num,应有两位相同的整数组成,如果存在这个数,则返回True,否则返回False
        那么,执行来看,首先相当的是二分查找,定义左右区间left, right, left = 0, right = num
        判断条件是当left小于等于right,定义中间值,由题意可知,应该是左右向中间移动,因此
        mid = (left + right) // 2
        //是向下取整的意思
        判断,如果取到的mid的平方等于num,那么返回True
        如果mid的平方大于num,那么说明取的mid取大了,那么右区间向左移动一位,也就是减一
        如果mid的平方小于num,那么说明取的mid取小了,那么左区间向右移动一位,也就是加一
        最后如果整个循环结束,并未返回True,那么说明num不是一个完全平方数,因此我们返回False
        :param num:
        :return:
        """
        left, right = 0, num
        while left <= right:
            mid = (left + right) // 2
            if mid*mid == num:
                return True
            elif mid*mid > num:
                right = mid - 1
            else:
                left = mid + 1
        return False

Solution().isPerfectSquare(num)

四、测试结果

暴力解法

image.png

使用内部函数

image.png

javascript

image.png

二分查找

image.png