刷LeetCode100道-Day05

633.平方数之和

题目

给定一个非负整数 c ,你要判断是否存在两个整数 ab,使得 a^2 + b^2 = c

示例 1:

    输入:c = 5
    输出:true
    解释:1 * 1 + 2 * 2 = 5

示例 2:

    输入:c = 3
    输出:false

提示:

  • 0 <= c <= 231 - 1

想法

因为最近一直在写双指针相关的题目,所以可能惯性思维拿到这题第一反应就是可以用双指针

a^2 + b^2 = c,a最小值可以为0,b的最大值一定是 c 的开根号然后去除小数点。(不能四舍五入)

比如

  1. 1 * 1 + 2 * 2 = 5 其中最大值2,是5的开根号去小数点
  2. 2 * 2 + 2 * 2 = 8 其中最大值2,是8的开根号去小数点
  3. 0 * 0 + 3 * 3 = 9 其中最大值3,是9的开根号正好是整数

了解了这部分取值规则,代码就很好写了

实现

/**
 * @param {number} c
 * @return {boolean}
 */
var judgeSquareSum = function(c) {
    let l = 0;
    let r = Math.floor(Math.sqrt(c));
    while(l <= r){
        let lVal = Math.pow(l,2);
        let rVal = Math.pow(r,2);
        if(lVal + rVal == c) return true;
        if(lVal + rVal < c) l ++;
        if(lVal + rVal > c) r --;
    }
    return false;
};

看了解析之后,觉得另外一种写法真不错,核心思想还是要用到开根号sqrt

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;
};

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容