版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址
http://blog.csdn.net/lzuacm。
C#版 - Leetcode 279. 完全平方数 - 题解
Leetcode 279. Perfect Squares
在线提交:
https://leetcode.com/problems/perfect-squares/
题目描述
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例 1:
输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4.
示例 2:
输入: n = 13
输出: 2
解释: 13 = 4 + 9.
● 题目难度: | 中等 |
思路:
首先由四平方和定理(拉格朗日定理) - Wikipedia: 每个正整数都可以表示为至多4个正整数的平方和。 如果把0包括进去,就正好可以表示为4个数的平方和。
比如:
,
(穷举可知7只有这种唯一的展开形式).
根据题意不考虑0,那拿去0后,一个数最后能分成的完全平方数的个数可能是1, 2, 3, 4.
然后,有一个容易得出的结论:
另外根据同余的性质以及
可知:
假如一个数n可表示为
, 则
,而
,
由于7具有唯一展开形式
(对应于代码中的path 1),故此时数n一定只能展开为4个数的平方和.
对于输入的正整数n,首先对n迭代,使
, 直到
== 0, 剩余的情形(从小到大)如下:
(会据实际情况转换为后面的6种情况之一,因而最后的路径为 path 3, path 2 or path 4).
(path 2)
(path 3)
(path 4)
(path 2)
(path 3)
(path 4)
故已AC代码如下:
public class Solution
{
public int NumSquares(int n) // 已知 n>0
{
while (n % 4 == 0)
n /= 4;
if (n % 8 == 7)
return 4; // (path 1)
for (int i = 0; i * i <= n; i++)
{
int r = (int)Math.Sqrt(n - i * i);
if (i * i + r * r == n)
{
if (i == 0 || r == 0)
return 1; // (path 2)
return 2; // (path 3)
}
}
return 3; // (path 4)
}
}
Rank:
You are here! Your runtime beats 100.00% of csharp submissions.