633-平方数之和

题目

633. 平方数之和 - 力扣(LeetCode) (leetcode-cn.com)

思路

题目需要尝试搜索两个数,使其之和为c, 首先我们需要确定搜索范围。要满足 a 2 + b 2 = c a^2 + b ^2 = c a2+b2=c,则必有
0 ≤ a ≤ c ,   0 ≤ b ≤ c , 0 \le a \le \sqrt{c},\ 0 \le b\le \sqrt{c}, 0ac , 0bc ,
因此,搜索范围限制在 [ 0 , c ] [0,\sqrt{c}] [0,c ]

我们设正确结果位于 [ a , b ] [a,b] [a,b]中,初始化 a = 0 ,   b = c a=0,\ b=\sqrt{c} a=0, b=c ,开始搜索。

如果 a 2 + b 2 < c a^2 + b^2 < c a2+b2<c,我们可以确定正确结果的范围在 [ a + 1 , b ] [a+1, b] [a+1,b];如果 a 2 + b 2 > c a^2 + b^2 > c a2+b2>c,我们可以确定正确结果的范围为 [ a , b − 1 ] [a,b-1] [a,b1],直到找到正确结果则返回true,如果搜索到区间大小为0( a > b a>b a>b)则范围false

正确性证明:

a 2 + b 2 < c a^2 + b^2 < c a2+b2<c时,除了将 a a a减1还可以通过将 b b b加1来使得$a^2 + b^2 的 结 果 增 大 , 然 而 , 我 们 在 之 前 的 步 骤 中 已 经 确 定 了 正 确 答 案 位 于 的结果增大,然而,我们在之前的步骤中已经确定了正确答案位于 [a,b] , 所 以 无 需 尝 试 ,所以无需尝试 b+1 , 因 此 正 确 结 果 必 定 位 于 ,因此正确结果必定位于 [a+1, b] 中 ; 对 于 中;对于 a^2 + b^2 > c$同理。

代码

class Solution {
public:
    bool judgeSquareSum(int c) {
        long a,b;
        a = 0;
        b = sqrt(c);

        while( a <= b) {
            long tmp = a * a + b * b;
            if (tmp == c) {
                return true;
            } else if ( tmp > c) {
                b--;
            } else {
                a++;
            }
        }return false;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值