633. 平方数之和

1.题目

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

示例 1:
输入:c = 5
输出:true
解释:1 ^1 + 2^2 = 5

示例 2:
输入:c = 3
输出:false

提示:
0 <= c <= 2^31 - 1

2.思路

2.1 双指针

不失一般性,可以假设a<b。初始时a=O,b=√c,进行如下操作:
如果a^ 2+b ^ 2=c,我们找到了题目要求的一个解,返回true;
如果a^ 2+b ^ 2<c,此时需要将a的值加1,继续查找;
如果a^ 2+b ^ 2>c,此时需要将b的值减1,继续查找。
当a=b时,结束查找,此时如果仍然没有找到整数a和b满足a^ 2+b ^ 2=c,则说明不存在题目要求的解,
返回false.

注意 0 <= c <= 2 ^ 31 - 1 因为相乘需要将精度设置为 long类型 64 位的

3.代码

object Solution {
    def judgeSquareSum(c: Int): Boolean = {
    var left : Long = 0
    var right : Long = Math.sqrt(c).toLong

    while (left<=right){
      if(left*left+right*right>c)  right = right - 1
      else if(left*left+right*right < c)  left = left - 1
      else  return  true
    }
    false
  }
}

4.复杂度分析

  • 时间复杂度:O(根号c)。最坏情况下 a 和 b 一共枚举了 0 到根号下c
    ​ 里的所有整数。
  • 空间复杂度:O(1)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值