平方数之和(双指针版本)

文章目录

      • 平方数之和
        • 题目描述
        • 解题思路
        • 代码实现
        • 复杂度分析

平方数之和

题目描述

  • 题目

给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。

  • 示例1:

     输入: 5
     输出: True
     解释: 1 * 1 + 2 * 2 = 5
    
  • 示例2:

      输入: 3
      输出: False
    

解题思路

首先判断特殊情况(c==0)
求出c的平方根值作为差找的终结点
判断两个指针指向的数字平方和与给定值的大小关系确定双指针的走向

  • 注意

  • 情况一

可能存在某个数的平方根的平方就是该值
(如:sqrt(4) == 2 而 恰巧 2*2 =4 )
这种情况需要特殊处理

  • 情况二

存在某数的平方和超过 int 类型的范围(既出现溢出现象)
下面处理的时候将其强转成了 long 类型(避免溢出现像的出现)

代码实现

class Solution {
public:
    bool judgeSquareSum(int c) {
        if(c==0){
            return true;
        }

        int left=1;
        int right=sqrt(c); 
        //求其平方根,作为右边指针的边界

        if(right*right==c){
        //特殊情况的处理
            return true;
        }

        while(left<=right){
            if((long)left*left + (long)right*right==c){
            //为了避免溢出现象发生,进行了强制类型转换
                return true;
            }else if((long)left*left +(long)right*right > c){
                right--;
            }else {
                left++;
            }
        }
        return false;
    }
};
  • 原题

复杂度分析

时间复杂度:O(log(n));
空间复杂度:O(n);

你可能感兴趣的:(刷题总结吧,#,LeetCode)