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;
    }
};

 

posted @ 2021-02-08 18:02  Mrsdwang  阅读(46)  评论(0)    收藏  举报