采用二分查找,但要特别注意几点:
1)mid=a+(b-a)/2防止溢出;
2)判断是否是平方不能直接判断mid^2与num,有可能会溢出,因此先求mid_2=num/mid,当能够整除,且mid_2==mid时,即找到平方根,如果最终都没有找到,那么返回false;
class Solution { public: bool isPerfectSquare(int num) { int a=1,b=num; while(a<=b){ int mid=a+(b-a)/2; int mid_2=num/mid; int sub=num-mid_2*mid; if(sub==0 && mid_2==mid) return true; if(mid_2<mid) b=mid-1; else a=mid+1; } return false; } };
利用数学方法:1+3+5+7+……+(2n-1)=n2,只需要不断的从num中去掉奇数最后看是否为0就可以了,比二分法更快;
class Solution { public: bool isPerfectSquare(int num) { int sum=1; while(num>0){ num-=sum; sum+=2; } return (num==0)? true:false; } };