力扣633(java&python)-平方数之和(中等)
题目:
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c 。
示例 1:
输入:c = 5
输出:true
解释:1 * 1 + 2 * 2 = 5
示例 2:
输入:c = 3
输出:false
提示:
0 <= c <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sum-of-square-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
一、双指针
根据a2 + b2 = c,可以得出a和b的取值范围均为[0,sqrt(c)],故可以初始化两个指针a = 0, b = sqrt(c),则开始循环,循环条件是当 a <= b:
- a2 + b2 < c : 当前值比目标值要小,a++;
- a2 + b2 > c:当前值比目标值要大,b--;
- a2 + b2 = c:找到符合条件的 a 和 b,返回 true
循环结束没找到符合条件的值,则返回false。
例如:图解参考@嘉然
1.给定c = 32, 初始值a = 0, b = 5, 25 < 32,则a++;
2.a = 1,b = 5,26 < 32,则a++;
3.a = 2,b = 5, 29 < 32,则a++;
4.a = 3,b = 5,34 > 32,则b--;
5.a = 3,b = 4,25 < 32,则a++;
6.a = 4,b = 4, 32与目标值相同,返回true
根据图解的过程可以发现:
1.初始化时橙色格子一定在矩阵的右上角;
2.每次比较 a2 + b2 和 c可以排除矩阵的一行或一列,即当前橙色格子的上方和右边的元素一定被排除了。
即
- 小于 c :左边的元素都小于当前元素,只能下移,相当于a++。此时排除的是橙色格子以及左边同行的元素,都小于 c ,所以不会错过正确答案;
- 大于 c :下面的元素都大于当前元素,只能左移,相当于b--。此时排除的是橙色格子以及下方同列的元素,都大于 c ,所以不会错过正确答案。
java代码:
注意:
long sum =(long) a * a + b * b;
如果不设为long 类型,a与b都是int类型,如果C为一个接近int极限值的值,b最大,在a++的过程中,sum算出来就可能超出int的最大值从而导致溢出。
1 class Solution { 2 public boolean judgeSquareSum(int c) { 3 int a = 0,b = (int)Math.sqrt(c); 4 while(a <= b){ 5 long sum =(long) a * a + b * b; 6 if(sum < c){ 7 a++; 8 }else if(sum > c){ 9 b--; 10 }else{ 11 return true; 12 } 13 } 14 return false; 15 } 16 }
python3代码:
1 class Solution: 2 def judgeSquareSum(self, c: int) -> bool: 3 a, b = 0, (int)(math.sqrt(c)) 4 while a <= b: 5 sum = a * a + b * b 6 if(sum < c): 7 a += 1 8 elif(sum > c): 9 b -= 1 10 else: 11 return True 12 return False
二、枚举
根据a2 + b2 = c,可以得出a和b的取值范围均为[0,sqrt(c)],那将a从[0,sqrt(c)],然后根据a算出b,然后对a * a + b * b == c进行判断,成立返回 true,不成立返回 fasle。
java代码:
1 class Solution { 2 public boolean judgeSquareSum(int c) { 3 int max = (int)Math.sqrt(c); 4 for(int a = 0; a <= max; a++){ 5 int b = (int)Math.sqrt(c - a * a); 6 if(a * a + b * b == c) return true; 7 } 8 return false; 9 } 10 }
python3代码:
1 class Solution: 2 def judgeSquareSum(self, c: int) -> bool: 3 max = (int)(math.sqrt(c)) 4 for a in range(max + 1): 5 b = (int)(math.sqrt(c - a * a)) 6 if a * a + b * b == c: 7 return True 8 return False
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)