633. 平方数之和-每日一题

一、题目

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

点击查看原题

二、思路

1)暴力+优化:

        解题优先考虑能够做出来,首先想到的就是暴力搜索的方法,由于c已经知道,只需要暴力搜索a和b即可,搜索范围为 ( 0 , c ) (0,\sqrt{c}) (0,c )
        对暴力搜索的优化:
        很容易想到双重循环找a和b,这样会造成很多的时间浪费,由于 a = c − b 2 a=\sqrt{c-b^2} a=cb2 ,可以只用一次遍历b,不断对a用sqrt函数求解,并判断a是否有小数即可(通过强转类型再判断是否相等即可)

2)双指针

        如果我们的双指针begin和end指向区间 ( 0 , c ) (0,\sqrt{c}) (0,c )的头和尾,有三种情况需要考虑:

1)如果 a 2 + b 2 = c a^2+b^2=c a2+b2=c,直接返回true
2)如果 a 2 + b 2 < c a^2+b^2<c a2+b2<c,则begin = begin + 1
3)如果,则end = end - 1

三、代码

1)暴力优化

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

        时间复杂度为 O ( c ) O(\sqrt{c}) O(c ),空间复杂度为O(1),但由于sqrt耗费时间较多,表现并不好。

2)双指针

class Solution {
    public boolean judgeSquareSum(int c) {
        int begin = 0, end = (int)Math.sqrt(c);
        while (begin <= end) {
            int val = begin * begin + end * end;
            if (val == c) {
                return true;
            }
            if (val < c) {
                begin++;
            } else {
                end--;
            }
        }
        return false;
    }
}

        时间复杂度为 O ( c ) O(\sqrt{c}) O(c ),空间复杂度为O(1),每个循环只有两次乘法运算,整体性能较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佳鑫大大

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值