给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 a2 + b2 = c。
示例1:
输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5
示例2:
输入: 3 输出: False
解题思路:
双指针。令n=sqrt(c),则a,b都必然在[0,n]之间,结合之前的两数之和,只不过这个是平方而已,原理一样,主要避免两种情况的多余运算,假设a<=b。
- 当a*a+b*b>c时,a不必再增加。
- 当a*a+b*b<c时,b不必再减小。
上面两点是双指针用法的关键思想,时间复杂度为n,且避免了较多的sqrt()运算。
class Solution { public: bool judgeSquareSum(int c) { int n = sqrt(c); int left = 0, right = n; while (left <= right) { int val = left*left + right*right; if (val == c) return true; if (val < c) left++; else right--; } return false; } }; |