自己的解法为:
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的平方根的位置上啊,我之前的解法简直是废的。
原文:https://www.cnblogs.com/--here--gold--you--want/p/14865623.html