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.


二、题意

给定一个正整数n,找出最少的平方数数字,使得找出的数字和为n。
例如给定数字12,则12 = 4 + 4 + 4或12 = 9 + 1 + 1 + 1,则前者的个数为3,后者个数为4,所以结果应该是3


三、思路

数字1:1的个数为1;
数字2:2 = 1 + 1,所以结果是2
......
数字4或9:1
数字12:因为由平方数组成,所以12拆成平方数的和,所以12 = 9 + 3或12 = 4 + 8或12 = 1 + 11,然后再拆3、8和11,其实只要知道3、8和11的最小组成个数,则很容易就能求出12的最小组成个数。

假设dp[i]表示数字i的最小组成个数,则dp[i] = min { dp[j] + dp[i - j],其中j为平方数,且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;
    }
};

你可能感兴趣的:(LeetCode279. Perfect Squares)