双指针 leetcode 633

自己的解法为:

 long num = c;
        long l = 0;
        long r = c;
        while (l <= r){
            if ((Math.pow(l, 2) + Math.pow(r, 2)) < num) {l++;continue;}
            if ((Math.pow(l, 2) + Math.pow(r, 2)) > num) {r--;continue;}
            return true;
        }
        return false;

使用了long是因为c太大时r平方会越界什么的, 但是当测试数据是一些很大的数的时候,直接超时了唉。

而整解的双指针法则因该是:

class Solution {
    public boolean judgeSquareSum(int c) {
        int l = 0, r = (int) Math.sqrt(c);
        while (l <= r) {
            int sum = l * l + r * r;
            if (sum < c) {
                l++;
            } else if (sum > c) {
                r--;
            } else { // sum == c
                return true;
            }
        }
        return false;
    }
}

实在太妙了,直接把r定为c的平方根,这样如果原来c就是可以由一个数平方而来的,一次循环就return了大大减少了时间。

而把r直接定位c的平方根,也省了不少的时间,因为r根本就不可能处在大于c的平方根的位置上啊,我之前的解法简直是废的。

posted @ 2021-06-09 09:47  ou尼酱~~~  阅读(109)  评论(0)    收藏  举报