1. 程式人生 > >Perfect Squares

Perfect Squares

return etc mil osi res sans gin segment cnblogs

方法一: 動態規劃

https://segmentfault.com/a/1190000003768736

https://siddontang.gitbooks.io/leetcode-solution/content/dynamic_programming/perfect_squares.html

復雜度

時間 O(N^2) 空間 O(N)

思路

如果一個數x可以表示為一個任意數a加上一個平方數bxb,也就是x=a+bxb,那麽能組成這個數x最少的平方數個數,就是能組成a最少的平方數個數加上1(因為b*b已經是平方數了)。

public class Solution {
    /**
     * @param n a positive integer
     * 
@return an integer */ public int numSquares(int n) { // Write your code here int[] dp = new int[n + 1]; // 將所有非平方數的結果置最大,保證之後比較的時候不被選中 Arrays.fill(dp, Integer.MAX_VALUE); // 將所有平方數的結果置1 for (int i = 0; i * i <= n; i++) { dp[i * i] = 1; }
// 從小到大找任意數a for (int i = 0; i <= n; i++) { // 從小到大找平方數bxb for (int j = 1; i + j * j <= n; j++) { // 因為a+b*b可能本身就是平方數,所以我們要取兩個中較小的 dp[i + j * j] = Math.min(dp[i] + 1, dp[i + j * j]); } } return dp[n]; } }

方法二:

數學 四平方和定理

https://www.cnblogs.com/grandyang/p/4800552.html

動態規劃

復雜度

時間 O(N^2) 空間 O(N)

思路

如果一個數x可以表示為一個任意數a加上一個平方數bxb,也就是x=a+bxb,那麽能組成這個數x最少的平方數個數,就是能組成a最少的平方數個數加上1(因為b*b已經是平方數了)。

Perfect Squares