有效的完全平方数
许久没写博客了,最近在刷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开方次,我是这样分析的,大家认为对吗,喜欢的话点个赞。