LeetCode 279. 完全平方数(Perfect Squares)

题目描述

 

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

示例 1:

输入: n = 12
输出: 3 
解释: 12 = 4 + 4 + 4.

示例 2:

输入: n = 13
输出: 2
解释: 13 = 4 + 9.

 

解题思路

 

利用动态规划思想解题,初始化dp数组令小于n的完全平方数为1,从1到n遍历求解最小组成个数,再对每个数遍历小于其的所有完全平方数,最小组成个数的状态转移方程为:

dp[i] = min(dp[i], dp[i - j * j] + 1)

 

代码

 

 1 class Solution {
 2 public:
 3     int numSquares(int n) {
 4         vector<int> dp(n + 1, INT_MAX);
 5         for(int i = 1; i * i <= n; i++)
 6             dp[i * i] = 1;
 7         for(int i = 1; i <= n; i++)
 8             for(int j = 1; j * j < i; j++)
 9                 dp[i] = min(dp[i], dp[i - j * j] + 1);
10         return dp[n];
11     }
12 };

 

posted @ 2018-09-05 19:10  FlyingWarrior  阅读(1878)  评论(0编辑  收藏  举报