算法 - Leetcode 633.平方数之和

题目描述

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

解题思路

将给定的非负整数c看作是根号c的平方,使用双指针,一大一小向中间逼近,如果两个指针平方之和大于c,说明右指针过大,则右指针递减,反之左指针递增。当左指针大于右指针,说明给定的非负整数c不是两个数的平方之和。

实现代码(js)

let judgeSquareSum = function (c) {
    
    
        // 定义左右指针 左指针从1开始递增 右指针从给定数值的开方值开始递减
        let a = 1,
          b = Math.sqrt(c);
        // 如果右指针为整数,说明给定数值为0和右指针数值的平方和
        if (b % 1 === 0) return true;
        // 如果右指针不为整数,则向下取整开始递减
        b = Math.floor(b);
        // 如果左指针大于右指针,则给定数值不是两个数的平方之和
        while (a <= b) {
    
    
          if (a * a + b * b === c) return true;
          // 如果左右指针平方之和小于给定数值,则左指针递增
          else if (a * a + b * b < c) a++;
          // 如果左右指针平方之和大于给定数值,则右指针递减
          else b--;
        }
        return false;
      };

总结

看到题目的第一反应就是用双指针,略微思考后觉得双指针可以实现。解这道题的关键是将c看作是根号c的平方,这样就能确定双指针中较大的那个指针的大小,从而确定双指针的范围。剩下的就是一些小细节,比如a可以从1开始递增,只要在循环前先判断c是否是右指针的平方,如果是则说明c=0*0+b^b;比如两个指针是可以相等的(c=2)等等。

猜你喜欢

转载自blog.csdn.net/solitary__/article/details/109599316