难度:中等
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c 。
解题思路
- 暴力法:直接遍历
- 双指针法:
- 先看是否有其中一个数为零,另一个数的平方== c的情况;
- 如果没有的话,那么先标记一个最大值为right,跟一个最小值left;
- 如果 left^2 + right ^2 > c,证明需要right太大了,反之left太小了;
题解
// 暴力法
public boolean judgeSquareSumSqrt(long c) {
for (long num1 = 0; num1 * num1 <= c; ++num1) {
double num2 = Math.sqrt(c - num1 * num1);
if (num2 == (int) num2) {
return true;
}
}
return false;
}
// 双指针法
public boolean judgeSquareSumPointer(long c) {
long right = (int) Math.sqrt(c);
if (right * right == c) {
return true;
}
long left = 0;
while (left <= right) {
long sum = left * left + right * right;
if (sum == c) {
return true;
} else if (sum < c) {
++left;
} else {
--right;
}
}
return false;
}
测试
SumOfSquareNumbers sumOfSquareNumbers = new SumOfSquareNumbers();
// region 暴力法
@Test
public void test_sqrt_case1() {
Assertions.assertTrue(sumOfSquareNumbers.judgeSquareSumSqrt(5));
}
@Test
public void test_sqrt_case2() {
Assertions.assertFalse(sumOfSquareNumbers.judgeSquareSumSqrt(3));
}
@Test
public void test_sqrt_case3() {
Assertions.assertTrue(sumOfSquareNumbers.judgeSquareSumSqrt(4));
}
@Test
public void test_sqrt_case4() {
Assertions.assertTrue(sumOfSquareNumbers.judgeSquareSumSqrt(2));
}
@Test
public void test_sqrt_case5() {
Assertions.assertTrue(sumOfSquareNumbers.judgeSquareSumSqrt(1));
}
@Test
public void test_sqrt_case6() {
Assertions.assertTrue(sumOfSquareNumbers.judgeSquareSumSqrt(0));
}
// endregion
// region 双指针
@Test
public void test_pointer_case1() {
Assertions.assertTrue(sumOfSquareNumbers.judgeSquareSumPointer(5));
}
@Test
public void test_pointer_case2() {
Assertions.assertFalse(sumOfSquareNumbers.judgeSquareSumPointer(3));
}
@Test
public void test_pointer_case3() {
Assertions.assertTrue(sumOfSquareNumbers.judgeSquareSumPointer(4));
}
@Test
public void test_pointer_case4() {
Assertions.assertTrue(sumOfSquareNumbers.judgeSquareSumPointer(2));
}
@Test
public void test_pointer_case5() {
Assertions.assertTrue(sumOfSquareNumbers.judgeSquareSumPointer(1));
}
@Test
public void test_pointer_case6() {
Assertions.assertTrue(sumOfSquareNumbers.judgeSquareSumPointer(0));
}
// endregion