LeetCode 633.平方数之和

在此题最容易的想法就是暴力法做嵌套循环,下面源码:

class Solution {
    public boolean judgeSquareSum(int c) {
        int a = (int)Math.sqrt(c);
        for(int i=0; i<=a ;i++)
        {
            for(int j=0; j<=a ;j++)
            {
                if(i*i +j*j == c)	 return true;
            }
        }
        return false;
    }
}

这样写当然没问题,但是这种暴力算法时间复杂度无疑是非常高的,在LeetCode中提交结果就是“超出时间限制”(本人已经试过了)。
遂思考,如何才能适当降低所需时间;本题需要的只是判断是否可以由平方数组成,而不是打印出所有可能,所以可以先讨论一下一个最特殊的情况:是否自身就是可以开平方之后为整数的呢?

int a = (int)Math.sqrt(c);
if(a*a == c)    return true;

之后通过循环来实现判断
循环内部语句定义一个值,储存c-i**2,再判断此值是否可开方为整数即可

for(int i=a; i>=0 ;i--)
        {
            int d = c-i*i;
            int e =(int)Math.sqrt(d);
            if(e*e == d)    return true;
        }

感想:在做题时可将极为特殊的情况列出来,其次逆推法可能对解题更有帮助。

你可能感兴趣的:(入门练习,Java,LeetCode)