每日算法:633. 平方数之和

139 阅读1分钟

难度:中等

给定一个非负整数 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