有效的完全平方数

  许久没写博客了,最近在刷lettcode,希望每天一道能坚持下去。

  今天分享一个定理吧,也是一个判定有效的完全平方数的技巧,使用该技巧的代码感觉和自己写的代码运行效率有天壤之别。

  客官,请坐,先看今天的题:链接:https://leetcode-cn.com/problems/valid-perfect-square

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

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

示例 1:

输入:16
输出:True
示例 2:

输入:14
输出:False

一开始我的思路就是暴力破解,从0到num/2+1分别平方与num作比较,若存在相等的情况,则返回true,若循环结束,返回false.因为num/2+1必定会大于sqrt(num),即大于num的开方,即使这样能实现要求,但最后的运行时间和使用内存是我做题以为数量级最大的,请看图!

速度太慢,那有没有其他的好办法呢,下面介绍一下完全平方数的一个性质:利用 1+3+5+7+9+…+(2n-1)=n^2,即完全平方数肯定是前n个连续奇数的和,意思是我们只要拿num从1这个奇数开始连续减奇数,最后若刚好减到0,则为完全平方数,所以出现了下图。

428ms vs 1ms,第二种方式完胜,可能原因有计算机擅长做加减法而不适合做方法1的乘法,也有方法1最差情况下执行num/2+2次,方法二只需要执行大约num开方次,我是这样分析的,大家认为对吗,喜欢的话点个赞。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值