367. Valid Perfect Square
仅供自己学习
思路:
在学二分法,想到用二分法来做,从1-num这个范围进行二分,每次判断 mid*mid是否等于num,相当于找最后一个平方和不大于num的数,如果存在则这个数的平方和就为num,不存在退出循环并返回FALSE即可,其余就是二分法的模板写法。
代码:
1 class Solution { 2 public: 3 bool isPerfectSquare(int num) { 4 int left=0,right=num; 5 while(left<=right){ 6 long mid=left+(right-left)/2,t=mid*mid; 7 if(t==num) return true; 8 if(t<num) left = mid+1; 9 else right =mid-1; 10 } 11 return false; 12 } 13 };
还有一种方法是将num 除以 2并判断这个数 x 的平方是否等于num,如果小于则遍历num/2 ~ x*2 的所有数,判断平方和是否等于num,如果大于则继续除以2。
代码:
class Solution { public: bool isPerfectSquare(int num) { if(num==1) return true; long x=num/2; //这里用int 超范围了 while( x*x > num){ x=x/2; } for(long i=x;i<x*2;++i){ //用long也是因为int超范围 if(i*i == num) return true; } return false; } };

浙公网安备 33010602011771号