有效的完全平方数

  许久没写博客了,最近在刷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张图片有效的完全平方数_第2张图片

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

有效的完全平方数_第3张图片

有效的完全平方数_第4张图片

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

你可能感兴趣的:(lettcode)