LeetCode 279. 完全平方數 (C#實現)
阿新 • • 發佈:2019-03-07
blog span code 一個數 ++ 表示 res 動態 分享 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://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
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#實現)