「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」
前言
每日一题,轻松解题
每日一题为刷题系列 每日刷一题LeetCode题,并且对题目进行分析,分享思路。
正文
:平方数之和
难度:中等
题目要求:
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a*a + b*b = c 。
分析题目:
对于给定的非负整数 cc,需要判断是否存在整数 aa 和 bb,使得 a^2 + b^2 = ca 2 +b 2 =c。可以枚举 aa 和 bb 所有可能的情况,时间复杂度为 O(c^2)O(c 2 )。但是暴力枚举有一些情况是没有必要的。例如:当 c = 20c=20 时,当 a = 1a=1 的时候,枚举 bb 的时候,只需要枚举到 b = 5b=5 就可以结束了,这是因为 1^2 + 5^2 = 25 > 201 2 +5 2 =25>20。当 b > 5b>5 时,一定有 1^2 + b^2 > 201 2 +b 2>20。
举个例子
输入: c = 5
输出: true
解释: 1 * 1 + 2 * 2 = 5
:解题
方法一
理清思路:
在枚举 aa 的同时,使用 \texttt{sqrt}sqrt 函数找出 bb。注意:本题 cc 的取值范围在 0,2^{31} - 1,因此在计算的过程中可能会发生 \texttt{int}int 型溢出的情况,需要使用 \texttt{long}long 型避免溢出
编辑代码:
var judgeSquareSum = function(c) {
for (let a = 0; a * a <= c; a++) {
const b = Math.sqrt(c - a * a);
if (b === parseInt(b)) {
return true;
}
}
return false;
};
方法二:双指针
理清思路:
不失一般性,可以假设 a \le ba≤b。初始时 a = 0a=0,b = \sqrt{c}b= c ,进行如下操作:
如果 a^2 + b^2 = ca 2 +b 2 =c,我们找到了题目要求的一个解,返回 \text{true}true; 如果 a^2 + b^2 < ca 2 +b 2 <c,此时需要将 aa 的值加 11,继续查找; 如果 a^2 + b^2 > ca 2 +b 2>c,此时需要将 bb 的值减 11,继续查找。 当 a = ba=b 时,结束查找,此时如果仍然没有找到整数 aa 和 bb 满足 a^2 + b^2 = ca 2 +b 2 =c,则说明不存在题目要求的解,返回 \text{false}false。
编辑代码:
var judgeSquareSum = function(c) {
let left = 0;
let right = Math.floor(Math.sqrt(c));
while (left <= right) {
const sum = left * left + right * right;
if (sum === c) {
return true;
} else if (sum > c) {
right--;
} else {
left++;
}
}
return false;
};
总结
无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。