367. Valid Perfect Square
Description:
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: 16 Returns: True
Example 2:
Input: 14 Returns: False
Credits:
Special thanks to @elmirap for adding this problem and creating all test cases.
Solution:
一、题意理解
就是给定一个矩形的面积(正整数)。看它是不是正方形。
二、分析
1、题意很明确,我们的目标就是给定一个正整数num,看它能不能写成 num = n*n的形式,我们可以从1~num-1;优化一点,1~num/2;再优化一点,sqrt(num-1) ~ sqrt(num)+1这些范围内寻找一个整数n,看是否有n*n=num。但是题目明确说了不能使用sqrt。
2、上面的解法依然是属于o(n)的时间复杂度,并不是我们想要的效果。这题的本质其实是一个查找问题,而查找的话,比较快速的算法就是二分查找。所以我们完全可以在1~num的范围内运用二分查找,来找到这样一个n,使得n*n= num。时间复杂度为O(Log(n))
3、代码如下所示:
class Solution {
public:
bool isPerfectSquare(int num) {
long begin = 1, end = num;
while(begin <= end)
{
long flag = (begin + end) / 2;
long square = flag * flag;
if(square == num)
return true;
else if(square > num)
end = flag - 1;
else
begin = flag + 1;
}
return false;
}
};