1. 程式人生 > >LeetCode 279. 完全平方數 (C#實現)

LeetCode 279. 完全平方數 (C#實現)

blog span code 一個數 ++ 表示 res 動態 分享

問題:https://leetcode-cn.com/problems/perfect-squares/

GitHub實現:https://github.com/JonathanZxxxx/LeetCode/blob/master/NumSquares.cs

一、動態規劃實現

1、思路:對一個數字n而言,組成的它的完全平方數的最少個數可以根據它減去i*i(這裏i*i<n)後對應的那個數的最少完全平方數加一,通過改變i的值最終取得最小值

從簡單情況開始
1 1>=1*1 所以1對應等於0對應的最小個數加1,這裏0對應的個數為0
2 2>=1*1 所以2對應等於1對應的最小個個數加1,因為之前已經記錄了1對應的最小值為1,所以這裏最小為2

3 3>=1*1 所以3對應等於2對應的最小個個數加1,因為之前已經記錄了2對應的最小值為1,所以這裏最小為3
4 4>=1*1和4>=4 所以4對應等於3或者0對應的最小個個數加1,因為之前已經記錄了3對應的最小值為3,0對應的最小值為0,所以最終的最小值為1。
往後的情況依次類推


參考:https://blog.csdn.net/zw159357/article/details/82595031

        public int NumSquares(int n)
        {
            int[] dp = new int[n + 1];
            
for (int i = 1; i <= n; i++) { dp[i] = n; } for (int i = 1; i <= n; i++) { int j = 1; while (i - j * j >= 0) { dp[i] = Math.Min(dp[i], dp[i - j * j] + 1
); j++; } } return dp[n]; }

二、四平方和定理實現

1、思路:任何一個正整數都可以表示成不超過四個整數的平方之和;推論:滿足四數平方和定理的數n(四個整數的情況),必定滿足 n=4^a(8b+7)

技術分享圖片

參考:https://blog.csdn.net/lzuacm/article/details/81434270

        public int NumSquares2(int n)
        {
            while (n % 4 == 0)
            {
                n /= 4;
            }
            if (n % 8 == 7)
            {
                return 4;
            }
            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;
                    return 2;
                }
            }
            return 3;
        }

LeetCode 279. 完全平方數 (C#實現)