Leetcode367 Valid Perfect Square

题目描述

Given a positive integer num, write a function which returns True if num is a perfect square else False.
Note: Do not use any built-in library function such as sqrt.

Example 1:

Input: 16
Returns: True
Example 2:
Input: 14
Returns: False
思路

切入点:
1.perfectSquare有特殊的性质
2.范围筛选排查类问题可以用递归、二分等方法缩小查找范围

算法1 递归拆解

将perfectSquare拆成的若干个数的乘积,这些数应该正好能分成相同的两份。按照这个思路,对所有num能整除的数a进行检查,是否num/a还能再整除一个a,如果是的话再递归的检查 num/a2 n u m / a 2 是否也能拆出两个相同的乘数。

考虑到特别大的素数,要对检查范围进行一个筛选。

class Solution {
public:
    bool isPerfectSquare(int num) {
        if(num==0)
            return false;
        if(num==1)
            return true;

        int top=min(num/2,99991);
        for(int i=2;i<=top;i++)
        {
            if(num%i==0)
            {
                int devide=num/i;
                if(devide==i)
                    return true;
                else if(devide%i)
                {
                    return isPerfectSquare(devide);
                }
            }
        }
        return false;
    }
};
算法2 二分法接近开根后的值

既然不让开根号,将数的平方和num比较也是一样的。对于一些无法拆解的大质数,二分法可以迅速缩小范围,比上一个做法要快。

class Solution {
public:
    inline long int square(long int a)
    {
        return a*a;
    }

    bool isPerfectSquare(int num) {
        if(num==1)
            return true;
        if(num==0)
            return false;

        long int start=0;
        long int end=num/2;
        while(start<=end)
        {
            long int tmp=square((start+end)/2);           

            if(tmp==num)
                return true;
            else if(tmp>num)
                end=(start+end)/2-1;
            else if(tmp<num)
                start=(start+end)/2+1;          
        }
        return false;
    }
};

这里写图片描述

正入万山圈子里,一山放过一山拦。
实在不是我勇敢,是滚滚红尘没有回头路呀。你一定要这么觉得,像这样走着的我,背影像个英雄。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值