
/**
给定一个n,则小于等于n的完全平方数是确定的; 转化为,给定一个集合,从集合中选择最少的元素凑出n(可重复选择),与零兑换几乎完全一致
minNums[]:记录结果, minNums[i],代表凑出i需要的最少完全平方数;
凑出为0的元素数:minNums[0] = 0 (0,不需要要任何元素)
凑出为1的元素数:minNums[1] =minNums[1] (1,就是他本身即可)
凑出为2的元素数:Math.min(minNums[2],minNums[2 - num:nums] + 1) 直接用元素2(有的话) 或先直接用一个小于等于2的元素,再加上凑出minNums[2 - num:nums]需要的元素数
凑出为3的元素数:Math.min(minNums[3],minNums[3 - num:nums] + 1) 直接用元素3(有的话) 或先直接用一个小于等于3的元素,再加上凑出minNums[3 - num:nums]需要的元素数
.........
凑出为i的完全平方数:Math.min(minNums[i],minNums[i - num:nums] + 1) 直接用元素i(有的话) 或先直接用一个小于等于i的元素,再加上凑出minNums[i - num:nums]需要的元素数
minNums[i - num:nums] + 1; +1代表先用了一个值为i的元素, minNums[i - num:nums]代表凑出i - num需要元素数(已经有了num,还需要i - num)
*/
class Solution {
/**
给定一个n,则小于等于n的完全平方数是确定的; 转化为,给定一个集合,从集合中选择最少的元素凑出n(可重复选择),与零兑换几乎完全一致
minNums[]:记录结果, minNums[i],代表凑出i需要的最少完全平方数;
凑出为0的元素数:minNums[0] = 0 (0,不需要要任何元素)
凑出为1的元素数:minNums[1] =minNums[1] (1,就是他本身即可)
凑出为2的元素数:Math.min(minNums[2],minNums[2 - num:nums] + 1) 直接用元素2(有的话) 或先直接用一个小于等于2的元素,再加上凑出minNums[2 - num:nums]需要的元素数
凑出为3的元素数:Math.min(minNums[3],minNums[3 - num:nums] + 1) 直接用元素3(有的话) 或先直接用一个小于等于3的元素,再加上凑出minNums[3 - num:nums]需要的元素数
.........
凑出为i的完全平方数:Math.min(minNums[i],minNums[i - num:nums] + 1) 直接用元素i(有的话) 或先直接用一个小于等于i的元素,再加上凑出minNums[i - num:nums]需要的元素数
minNums[i - num:nums] + 1; +1代表先用了一个值为i的元素, minNums[i - num:nums]代表凑出i - num需要元素数(已经有了num,还需要i - num)
*/
public int numSquares(int n) {
//记录结果
int[] dp = new int[n + 1];
//初始化
Arrays.fill(dp, n + 1);
dp[0] = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j*j <= i; j++) {
dp[i] = Math.min(dp[i], dp[i - j*j] + 1);
}
}
return dp[n];
}
}
537

被折叠的 条评论
为什么被折叠?



