博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] 367. Valid Perfect Square 检验完全平方数
阅读量:5088 次
发布时间:2019-06-13

本文共 2292 字,大约阅读时间需要 7 分钟。

 

Given a positive integer num, write a function which returns True if num is a perfect square else False.

Note: Do not use any built-in library function such as sqrt.

Example 1:

Input: 16Returns: True

Example 2:

Input: 14Returns: False

Credits:

Special thanks to for adding this problem and creating all test cases.

 

这道题给了我们一个数,让我们判断其是否为完全平方数,那么显而易见的是,肯定不能使用 brute force,这样太不高效了,那么最小是能以指数的速度来缩小范围,那么我最先想出的方法是这样的,比如一个数字 49,我们先对其除以2,得到 24,发现 24 的平方大于 49,那么再对 24 除以2,得到 12,发现 12 的平方还是大于 49,再对 12 除以2,得到6,发现6的平方小于 49,于是遍历6到 12 中的所有数,看有没有平方等于 49 的,有就返回 true,没有就返回 false,参见代码如下:

 

解法一:

class Solution {public:    bool isPerfectSquare(int num) {        if (num == 1) return true;        long x = num / 2, t = x * x;        while (t > num) {            x /= 2;            t = x * x;        }        for (int i = x; i <= 2 * x; ++i) {            if (i * i == num) return true;        }        return false;    }};

 

下面这种方法也比较高效,从1搜索到 sqrt(num),看有没有平方正好等于 num 的数:

 

解法二:

class Solution {public:    bool isPerfectSquare(int num) {        for (int i = 1; i <= num / i; ++i) {            if (i * i == num) return true;        }        return false;    }};

 

我们也可以使用二分查找法来做,要查找的数为 mid*mid,参见代码如下:

 

解法三:

class Solution {public:    bool isPerfectSquare(int num) {        long left = 0, right = num;        while (left <= right) {            long mid = left + (right - left) / 2, t = mid * mid;            if (t == num) return true;            if (t < num) left = mid + 1;            else right = mid - 1;        }        return false;    }};

 

下面这种方法就是纯数学解法了,利用到了这样一条性质,完全平方数是一系列奇数之和,例如:

1 = 1

4 = 1 + 3
9 = 1 + 3 + 5
16 = 1 + 3 + 5 + 7
25 = 1 + 3 + 5 + 7 + 9
36 = 1 + 3 + 5 + 7 + 9 + 11
....
1+3+...+(2n-1) = (2n-1 + 1)n/2 = n*n

这里就不做证明了,我也不会证明,知道了这条性质,就可以利用其来解题了,时间复杂度为 O(sqrt(n))。

 

解法四:

class Solution {public:    bool isPerfectSquare(int num) {        int i = 1;        while (num > 0) {            num -= i;            i += 2;        }        return num == 0;    }};

 

下面这种方法是第一种方法的类似方法,更加精简了,时间复杂度为 O(lgn):

 

解法五:

class Solution {public:    bool isPerfectSquare(int num) {        long x = num;        while (x * x > num) {            x = (x + num / x) / 2;        }        return x * x == num;    }};

 

这道题其实还有 O(1) 的解法,这你敢信?简直太丧心病狂了,详情请参见论坛上的。

 

Github 同步地址:

 

类似题目:

 

参考资料:

 

转载于:https://www.cnblogs.com/grandyang/p/5619296.html

你可能感兴趣的文章
【Vegas原创】Mysql绿色版安装方法
查看>>
Thrift Expected protocol id ffffff82 but got 0
查看>>
.NET下XML文件的读写
查看>>
2009程序员考试大纲
查看>>
Linq to XML
查看>>
[HDOJ3718]Similarity(KM算法,二分图最大匹配)
查看>>
a 标签中调用js的几种方法
查看>>
从SQL Server 2005 中 导入 导出 excel 表格
查看>>
R Shiny(开源的R包)
查看>>
用Tensorflow做蝴蝶检测
查看>>
Hbuilder编辑器 设置less即时编译环境
查看>>
【2.2】创建博客文章模型
查看>>
【3.1】Cookiecutter安装和使用
查看>>
【2.3】初始Django Shell
查看>>
Linux(Centos)之安装Redis及注意事项
查看>>
VC(VISUAL_C++)虚拟键VK值列表
查看>>
《风笛》-林白
查看>>
Android 网络请求框架Retrofit
查看>>
GeoServer手动发布本地Shapefile地图
查看>>
KMP之我见
查看>>