LeetCode练习题279. 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.

Example 1:

1
2
3
Input: n = 12
Output: 3
Explanation: 12 = 4 + 4 + 4.

Example 2:

1
2
3
Input: n = 13 
Output: 2
Explanation: 13 = 4 + 9

分析

这道题也是典型的动态规划问题。

划分子问题:求出构成数值 i 至少要多少个perfect square number,并把这个最小值存入 minResult[ i ],其中 i 从 1 到 n。这样划分子问题的话,子问题的规模就是从小到大。

确定子问题的关系:求 minResult[ i ] 时,用变量 j 进行循环,j 的值为 1,2,3,4…,那么 j * j 就代表各个 square number,即1,4,9,16…,那么有子问题关系为 minResult[ i ] = minResult[ i - j * j ] + 1。

实现的一些细节:一开始声明 minResult 长度为 n + 1,值全为 INT_MAX,并初始化minResult[0] = 0,minResult[1] = 1,因为这两个值是很容易得知的,并且后面的计算要利用这两个值。求 minResult[ i ] 时,用变量 j 进行循环,当 j * j > i,就要退出循环,即找到了最小的 minResult[ i ] 。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
    int numSquares(int n) {
        vector<int> minResult(n + 1, INT_MAX);
        minResult[0] = 0;
        minResult[1] = 1;

        for (int i = 2; i <= n; i++) {  //求数字为i的最小完美正方数,从2开始
            for (int j = 1; j * j <= i; j++) {  //j为1,2,3,4... j * j 为1, 4, 9, 16...
                if (minResult[i - j * j] + 1 < minResult[i]) {
                    minResult[i] = minResult[i - j * j] + 1;
                }

            }
        }

        return minResult[n];
    }
};
坚持原创技术分享,您的支持将鼓励我继续创作!