633. 平方数之和
- 1. 题目描述
- 2.详细题解
- 3.代码实现
- 3.1 Python
- 3.2 Java
- 内存溢出溢出代码
- 正确代码与截图
1. 题目描述
题目中转:633. 平方数之和
2.详细题解
本题是167. 两数之和 II - 输入有序数组(中等)题目的变型,由两数之和变为两数平方之和,判断是否存在满足条件的两个整数a和b,使之平方之和等于给定的整数c。
对于给定整数c,a和b最小值为0,最大值为c的平方根,因此,两个双指针的初始值分别为0和c的平方根(取整数),算法如下:
- Step1:初始化:left=0,right=c的平方根取整;
- Step2:计算left和right指向数字平方之和;
- Step3:如果平方之和等于给定数字c,则中止返回True
- Step4:如果平方之和大于给定数字c,则右指针right减少1,让平方之和小一点;
- Step5:如果平方之和小于给定数字c,则左指针left增加1,让平方之和大一点;
- Step6:重复步骤Step2_Step5.
3.代码实现
3.1 Python
import math
class Solution:
def judgeSquareSum(self, c: int) -> bool:
left, right = 0 , int(math.sqrt(c))
res = False
while left <= right:
sum = left ** 2 + right ** 2
if sum == c:
res = True
break
elif sum > c:
right -= 1
else:
left += 1
return res
3.2 Java
- Java实现需要尤其注意的是,对于数字有数据类型,仔细查看题意要求的数字范围,因此需要使用long整数类型,否则程序会因为内存溢出导致错误结果,如下代码和截图所示:
内存溢出溢出代码
class Solution {
public boolean judgeSquareSum(int c) {
int left = 0, right = (int) Math.sqrt(c);
int total = 0;
boolean res = false;
while (left <= right){
total = left * left + right * right;
if (total == c){res = true;break;}
else if(total > c){right--;}
else{left++;}
}
return res;
}
}
调整整数数据类型,重新debug代码:
正确代码与截图
class Solution {
public boolean judgeSquareSum(int c) {
long left = 0, right = (long) Math.sqrt(c);
long total = 0;
boolean res = false;
while (left <= right){
total = left * left + right * right;
if (total == c){res = true;break;}
else if(total > c){right--;}
else{left++;}
}
return res;
}
}
执行用时不必过于纠结,对比可以发现,对于python和java完全相同的编写,java的时间一般是优于python的;至于编写的代码的执行用时击败多少对手,执行用时和网络环境、当前提交代码人数等均有关系,可以尝试完全相同的代码多次执行用时也不是完全相同,只要确保自己代码的算法时间复杂度满足相应要求即可,也可以通过点击分布图查看其它coder的code。