每日一题 -- leetCode633

331 阅读2分钟

image.png 「这是我参与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;
};

总结

无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。