LeetCode 279. 徹底平方數 (C#實現)——動態規劃,四平方和定理

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

給定正整數 n,找到若干個徹底平方數(好比 1, 4, 9, 16, ...)使得它們的和等於 n。你須要讓組成和的徹底平方數的個數最少。 示例 1: 輸入: n = 12 輸出: 3 解釋: 12 = 4 + 4 + 4. 示例 2: 輸入: n = 13 輸出: 2 解釋: 13 = 4 + 9.

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

Blog:https://www.cnblogs.com/zxxxx/url

 

1、動態規劃實現spa

一、思路:對一個數字n而言,組成的它的徹底平方數的最少個數能夠根據它減去i*i(這裏i*i<n)後對應的那個數的最少徹底平方數加一,經過改變i的值最終取得最小值.net

從簡單狀況開始
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。
日後的狀況依次類推code


參考:LeetCode-【動態規劃】-徹底平方數blog

 

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]; }

 

2、四平方和定理實現leetcode

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

 

參考:C#版[擊敗100%的提交] - Leetcode 279. 徹底平方數 - 題解it

 

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; }
相關文章
相關標籤/搜索