LeetCode279. Perfect Squares

一、原題

Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.

For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.


二、題意

給定一個正整數(shù)n,找出最少的平方數(shù)數(shù)字,使得找出的數(shù)字和為n。
例如給定數(shù)字12,則12 = 4 + 4 + 4或12 = 9 + 1 + 1 + 1,則前者的個數(shù)為3,后者個數(shù)為4,所以結(jié)果應(yīng)該是3


三、思路

數(shù)字1:1的個數(shù)為1;
數(shù)字2:2 = 1 + 1,所以結(jié)果是2
......
數(shù)字4或9:1
數(shù)字12:因?yàn)橛善椒綌?shù)組成,所以12拆成平方數(shù)的和,所以12 = 9 + 3或12 = 4 + 8或12 = 1 + 11,然后再拆3、8和11,其實(shí)只要知道3、8和11的最小組成個數(shù),則很容易就能求出12的最小組成個數(shù)。

假設(shè)dp[i]表示數(shù)字i的最小組成個數(shù),則dp[i] = min { dp[j] + dp[i - j],其中j為平方數(shù),且j < i }


四、代碼

class Solution {
public:
    int min(int a, int b){
        return a < b ? a : b;
    }
  
    int numSquares(int n) {
        int *dp = new int[n + 1];
        dp[0] = 0;
        dp[1] = 1;
        int num;

        for (int i = 2; i <= n; ++i) {
            num = 0x0fffffff;
            int j = sqrt(i);

            if (i - j * j == 0) {
                dp[i] = 1;
                continue;
            }

            for (; j >= 1; --j) {
                num = min(num, dp[j * j] + dp[i - j * j]);
            }
            dp[i] = num;
        }

        int res = dp[n];
        delete[] dp;
        return res;
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容