持续创作,加速成长!这是我参与「掘金日新计划 · 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)
四、测试结果
暴力解法
使用内部函数
javascript