[LeetCode] Sum of Square Numbers 平方数之和

简介: Given a non-negative integer c, your task is to decide whether there're two integers a and b such that a2 + b2 = c. Example 1: Input: 5 Output: True Explanation: 1 * 1 + 2 * 2 = 5  Example 2: Input: 3 Output: False 这道题让我们求一个数是否能由平方数之和组成,刚开始博主没仔细看题,没有看到必须要是两个平方数之和,博主以为任意一个就可以。

Given a non-negative integer c, your task is to decide whether there're two integers a and b such that a2 + b2 = c.

Example 1:

Input: 5
Output: True
Explanation: 1 * 1 + 2 * 2 = 5 

Example 2:

Input: 3
Output: False

这道题让我们求一个数是否能由平方数之和组成,刚开始博主没仔细看题,没有看到必须要是两个平方数之和,博主以为任意一个就可以。所以写了个带优化的递归解法,楼主已经不是上来就无脑暴力破解的辣个青葱骚年了,直接带优化。可是居然对14返回false,难道14不等于1+4+9吗,结果仔细一看,必须要两个平方数之和。好吧,那么递归都省了,直接判断两次就行了。我们可以从c的平方根,注意即使c不是平方数,也会返回一个整型数。然后我们判断如果i*i等于c,说明c就是个平方数,只要再凑个0,就是两个平方数之和,返回true;如果不等于的话,那么算出差值c - i*i,如果这个差值也是平方数的话,返回true。遍历结束后返回false,参见代码如下:

解法一:

public:
    bool judgeSquareSum(int c) {
        for (int i = sqrt(c); i >= 0; --i) {
            if (i * i == c) return true;
            int d = c - i * i, t = sqrt(d);
            if (t * t == d) return true;
        }
        return false;
    }
};

下面这种方法用到了集合set,从0遍历到c的平方根,对于每个i*i,都加入集合set中,然后计算c - i*i,如果这个差值也在集合set中,返回true,遍历结束返回false,参见代码如下: 

解法二:

public:
    bool judgeSquareSum(int c) {
        unordered_set<int> s;
        for (int i = 0; i <= sqrt(c); ++i) {
            s.insert(i * i);
            if (s.count(c - i * i)) return true;
        }
        return false;
    }
}; 

上面两种方法都不是很高效,来看下面这种高效的解法。论坛上有人称之为二分解法,但是博主怎么觉得不是呢,虽然样子很像,但是并没有折半的操作啊。这里用a和b代表了左右两个范围,分别为0和c的平方根,然后while循环遍历,如果a*a + b*b刚好等于c,那么返回true;如果小于c,则a增大1;反之如果大于c,则b自减1,参见代码如下: 

解法三:

public:
    bool judgeSquareSum(int c) {
        int a = 0, b = sqrt(c);
        while (a <= b) {
            if (a * a + b * b == c) return true;
            else if (a * a + b * b < c) ++a;
            else --b;
        }
        return false;
    }
};

参考资料:

https://discuss.leetcode.com/topic/94568/simple-c-solution

https://discuss.leetcode.com/topic/94435/java-two-pointers-solution

https://discuss.leetcode.com/topic/94453/hashset-java-quick-solution-one-for-loop

本文转自博客园Grandyang的博客,原文链接:[LeetCode] Sum of Square Numbers 平方数之和

,如需转载请自行联系原博主。

相关文章
|
6月前
|
Go
golang力扣leetcode 279.完全平方数
golang力扣leetcode 279.完全平方数
48 0
|
3月前
|
Python
【Leetcode刷题Python】977. 有序数组的平方
解决LeetCode "有序数组的平方" 问题的方法:使用Python内置的快速排序、直接插入排序(但会超时)和双指针技术,并给出了每种方法的Python实现代码。
21 1
【Leetcode刷题Python】977. 有序数组的平方
|
3月前
|
Python
【Leetcode刷题Python】279. 完全平方数
LeetCode 279题 "完全平方数" 的Python解决方案,使用动态规划来找到和为给定整数n的完全平方数的最少数量。
31 0
|
3月前
|
Python
【Leetcode刷题Python】367. 有效的完全平方数
本文提供了两种判断一个正整数是否为完全平方数的Python实现方法:一种是利用数学公式逐个减去奇数的方法,另一种是使用二分查找优化的暴力求解方法。
60 0
【超直白】leetcode 279 完全平方数
【超直白】leetcode 279 完全平方数
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
|
6月前
leetcode代码记录(有序数组的平方
leetcode代码记录(有序数组的平方
28 0
|
6月前
[leetcode ~dp ]279. 完全平方数
[leetcode ~dp ]279. 完全平方数
|
6月前
代码随想录 Day38 完全背包问题 LeetCode T70 爬楼梯 T322 零钱兑换 T279 完全平方数
代码随想录 Day38 完全背包问题 LeetCode T70 爬楼梯 T322 零钱兑换 T279 完全平方数
36 0
|
6月前
leetcode-6118:最小差值平方和
leetcode-6118:最小差值平方和
33 0