题目:
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt
。
示例 1:
输入:16 输出:True
示例 2:
输入:14 输出:False
思路:
本题采用二分法,在1~num这个区间上采用二分法。知道了这一点问题就很容易了,基本可以秒做。
注意:
1、在leetcode上做题的时候,可以看到本题的分类为二分法,这是一个巨大的提示。如果事先不知道这一点,我们能否看到就想到二分法呢? 我们什么时候该想到二分法呢?
二分法的一个很大的作用是查找,如果题目是查找问题,应该本能的想到二分法,如果序列再是有序的,那么几乎就是用二分法了。或者是有序的一些变化,都应该考虑二分法。
2、本题我秒做之后提交没有通过,原因是我一开始将使用的数据定义为了int型,当输入一个很大的数的时候,mid*mid超出了int
可以表示的范围。所以将int换为long之后就可以了。这个问题我遇到了很多次,但是就是忍不住要错。
事实上,这类问题是很多的,有些时候即便是采用了long型数据也还是无法表示,甚至long long 型都不行。关键要看题目中的运算,如果题目中出现mid*mid这样的运算,那么数据的数量级必然会有很大的提升,此处仅仅是一个二次方,如果是其他更高次的运算问题更大。遇到问题之后,要仔细分析。根据数据的量级变化,选择合适的数据类型。甚至换用其他方法。
解答:
bool isPerfectSquare(int num) {
long left=1,right=num;
while(left<=right)
{
long mid=(left+right)/2;
if(mid*mid==num) return true;
else if(mid*mid>num) right=mid-1;
else left=mid+1;
}
return false;
}