[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

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

解法一:

class Solution {

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,参见代码如下: 

解法二:

class Solution {

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,参见代码如下: 

解法三:

class Solution {

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 平方数之和

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

时间: 2025-01-19 15:36:47

[LeetCode] Sum of Square Numbers 平方数之和的相关文章

[LeetCode] Two Sum IV - Input is a BST 两数之和之四 - 输入是二叉搜索树

Given a Binary Search Tree and a target number, return true if there exist two elements in the BST such that their sum is equal to the given target. Example 1: Input: 5 / \ 3 6 / \ \ 2 4 7 Target = 9 Output: True Example 2: Input: 5 / \ 3 6 / \ \ 2 4

算法-[编程题] 无平方数因数的数

问题描述 [编程题] 无平方数因数的数 如果一个正整数不能被大于1的完全平方数所整除,那么我们就将该数称为无平方数因数的数.例如,靠前的一些无平方数因数的数是{12356710111314151719-}.创建一个class SquareFree,其中包括一个函数getNumber在给定一个int n后,该函数能够返回第n个最小无平方因数的数.请注意这里是从1开始的,那么如果n=1该算法将会返回最小的无平方数因数的数. n 的取值范围为1到1000000000(其中包括1和1000000000)

算法题:UVa 11461 Square Numbers (简单数学)

11461 - Square Numbers Time limit: 1.000 seconds http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&category=467&page=show_problem&problem=24 56 A square number is an integer number whose square root is also an integer.

1000以内能被5整除的数之和的VBA代码

  下面的两种代码,功能都是求1000以内能被5整除的数之和. 第一种代码 Sub 求1到1000之间能被5整除的数之和() Dim I&, J& For I = 0 To 1000 Step 5 J = J + I Next MsgBox "1到1000之间能被5整除的数之和为" & J End Sub 第二种代码 Sub 求1到1000之间能被5整除的数之和2() Dim I&, J& For I = 100 To 1 Step -5 J =

leetcode 002 add two numbers C语言

问题描述 leetcode 002 add two numbers C语言 struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { struct ListNode *l, *p; l = (struct ListNode*)malloc(sizeof(struct ListNode)); l->val = l1->val + l2->val; p = l; l1 = l1->next; l

[LeetCode]165.Compare Version Numbers

[题目] Compare two version numbers version1 and version1. If version1 > version2 return 1, if version1 < version2 return -1, otherwise return 0. You may assume that the version strings are non-empty and contain only digits and the . character. The . c

leetcode 9 Palindrome Number 回文数

Determine whether an integer is a palindrome. Do this without extra space. click to show spoilers. Some hints: Could negative integers be palindromes? (ie, -1) If you are thinking of converting the integer to string, note the restriction of using ext

LeetCode 2 Add Two Numbers

翻译: 给你两个表示两个非负数字的链表.数字以相反的顺序存储,其节点包含单个数字.将这两个数字相加并将其作为一个链表返回. 输入: (2 -> 4 -> 3) + (5 -> 6 -> 4) 输出: 7 -> 0 -> 8 原题: You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of

[LeetCode] Bitwise AND of Numbers Range

Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive. For example, given the range [5, 7], you should return 4. 解题思路 ① n&(n-1),可以去除n的最低位的1. ② 从n一直与到m,可以去掉的1就是n和m的右端不相等的部分的1. 例如对于