LeetCode双指针:平方数之和

文章讲述了如何使用枚举法和双指针法解决LeetCode中的一个问题,即判断是否存在两个整数a和b,使得a²+b²=c。双指针法通过控制两个指针a和b的范围,有效减少了搜索空间,提高了效率。
摘要由CSDN通过智能技术生成

LeetCode双指针:平方数之和

题目描述

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

示例 1:

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

示例 2:

输入:c = 3
输出:false

解题思路1:枚举法

首先对c进行开方,作为遍历的一个上限,然后从0到根号 c \sqrt{c} c ,用 c − a ∗ a \sqrt{c-a*a} caa 再开根号,判断是否满足a*a+b*a==c

代码1

class Solution {
    public boolean judgeSquareSum(int c) {
        int max = (int)Math.sqrt(c);
        for (int a = 0; a <= max; a++) {
            int b = (int)Math.sqrt(c - a * a);
            if (a * a + b * b == c) return true;
        }
        return false;
    }
}

解题思路2:双指针法

由于 a 和 b 的范围均为 [0, c \sqrt{c} c ],因此我们可以使用「双指针」在 [0, c \sqrt{c} c ] 范围进行扫描:

小于 c :左边的元素都小于当前元素,只能下移,相当于low++。此时排除的是黄色格子以及左边同行的元素,都小于 c ,所以不会错过正确答案。
大于 c :下面的元素都大于当前元素,只能左移,相当于high--。此时排除的是黄色格子以及下方同列的元素,都大于 c ,所以不会错过正确答案。

image.png

代码2

class Solution {
    public boolean judgeSquareSum(int c) {
        long a = 0, b = (long) Math.sqrt(c);
        while (a <= b) {
            long cur = a * a + b * b;
            if (cur == c) {
                return true;
            } else if (cur > c) {
                b--;
            } else {
                a++;
            }
        }
        return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值