367ValidPerfectSquare

题意:输入一个数,判断该数是否是完全平方数(true是,false否),要求不能使用库函数sqrt

思路:1、任何一个数都能质因数分解,判断质因子是否成对出现;(超时)O(sqrt(n))

            2、找到a^2 = n中a的值,采用binary search。O(log(n/2))

           3 、递推关系式, x^2 - (x-1)^2 = 2x-1 ,... 3^2 - 2^2 = 2*3 -1, 2^2-1^2 = 2*2 -1, 所以,x^2 = 1+3+5+...+ (2x-1),即如果一个数是完全平方数,必定能写成1、3。。。的序列

 

    public boolean isPerfectSquare(int num) {
    	/*resolve prime factor
    	 * principle: every integer can be multiple of primes
    	 * composite if %2==0 except for 2
    	 * in case of prime self
    	 */
    	int gw = num % 10;
    	if(gw != 0 && gw != 1 && gw != 4 && gw != 9 && gw != 6 && gw != 5)
    		return false;
    	//binary search
    	int right = num / 2 + 1;
    	int left = 1;
    	int mid = (left + right) / 2;
    	long mul;
    	while(left <= right){
    	   // System.out.println(left + " " + mid + " " + right+ " "+ mid*mid); //mid * mid beyond range of int
    	    mul = mid * mid;
    		if(mul == num){
    		   return true; 
    		}
    		else if(mul > num || mul < 0){
    		    right = mid - 1;
    			mid = (left + right)/2;
    			
    		}else{
    			left = mid + 1;
    			mid = (left + right)/2;
    		}
    	}
    	return false;
    }
    public boolean isPerfectSquare(int num) {
    //1/3/5/.../2x-1
        int i = 1, tp = num;
        while(tp > 0){
            tp -= i;
            i += 2;
        }
        if(tp == 0)
            return true;
            else
                return false;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值