C#版[击败100%的提交] - Leetcode 279. 完全平方数 - 题解

版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址http://blog.csdn.net/lzuacm。 https://blog.csdn.net/yanglr2010/article/details/81434270

版权声明: 本文为博主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个数的平方和。

比如: 5 = 0 2 + 0 2 + 1 2 + 2 2 ,
7 = 1 2 + 1 2 + 1 2 + 2 2 (穷举可知7只有这种唯一的展开形式).

根据题意不考虑0,那拿去0后,一个数最后能分成的完全平方数的个数可能是1, 2, 3, 4.

然后,有一个容易得出的结论:
4 n = ( 2 a ) 2 + ( 2 b ) 2 + ( 2 c ) 2 + ( 2 d ) 2 4 k n = ( 2 k a ) 2 + ( 2 k b ) 2 + ( 2 k c ) 2 + ( 2 k d ) 2 n = a 2 + b 2 + c 2 + d 2 ( a , b , c , d , k , n Z + )

另外根据同余的性质以及 x 2 ( x ) 2 可知:
x 2 ( x ) 2 x 2 ( x ) 2 ( mod 8 )

假如一个数n可表示为 8 k + 7 , 则 n = x 2 ( x ) 2 ( mod 8 ) = 7 ,而 0 2 = 0 , 1 2 = 1 , 2 2 = 4 ,
由于7具有唯一展开形式 7 = 1 2 + 1 2 + 1 2 + 2 2 (对应于代码中的path 1),故此时数n一定只能展开为4个数的平方和.

对于输入的正整数n,首先对n迭代,使 n = n 4 , 直到 n / 4 == 0, 剩余的情形(从小到大)如下:
n = 8 k 0 2 + 0 2 + 0 2 + 0 2 + 8 = 0 2 + 0 2 + 2 2 + 2 2 (会据实际情况转换为后面的6种情况之一,因而最后的路径为 path 3, path 2 or path 4).

n = 8 k + 1 0 2 + 0 2 + 0 2 + 1 2 (path 2)
n = 8 k + 2 0 2 + 0 2 + 1 2 + 1 2 (path 3)
n = 8 k + 3 0 2 + 1 2 + 1 2 + 1 2 (path 4)
n = 8 k + 4 0 2 + 0 2 + 0 2 + 2 2 (path 2)
n = 8 k + 5 0 2 + 0 2 + 1 2 + 2 2 (path 3)
n = 8 k + 6 0 2 + 1 2 + 1 2 + 2 2 (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.

猜你喜欢

转载自blog.csdn.net/yanglr2010/article/details/81434270