279. 完全平方数
给你一个整数 n
,返回 和为 n
的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1
、4
、9
和 16
都是完全平方数,而 3
和 11
不是。
示例 1:
12
12 = 4 + 4 + 4
示例 2:
13
13 = 4 + 9
提示:
1 <= n <= 104
class Solution {
public int numSquares(int target) {
if(target==0|target==1){
return 1;
}
//构造完全平方数数组
List<Integer> list = new ArrayList<>();
for (int i = 0; i < target; i++) {
if(i*i<=target){
list.add(i*i);
}else break;
}
int size = list.size();
int[][] dp = new int[size][target + 1];
for (int i = 1; i <= target; i++) {
dp[1][i] = i;
}
for (int i = 2; i < size; i++) {
for (int j = 1; j <= target; j++) {
Integer num = list.get(i);
if(j<num){
dp[i][j] = dp[i - 1][j];
}else if(num==j){
dp[i][j] = 1;
}else {
dp[i][j] = Math.min(dp[i][num] + dp[i][j - num],dp[i - 1][j]);
}
}
}
return dp[size-1][target];
}
}
322. 零钱兑换
给你一个整数数组 coins
,表示不同面额的硬币;以及一个整数 amount
,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1
。
你可以认为每种硬币的数量是无限的。
示例 1:
[1, 2, 5]
11
3
示例 2:
[2]
3
示例 3:
输入:coins = [1], amount = 0
输出:0
提示:
1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104
class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount + 1];
Arrays.fill(dp, amount + 1); // 初始化为一个比amount大的数,表示当前金额无法被凑成,或者需要无限多的硬币
dp[0] = 0; // 金额为0时,不需要任何硬币
for (int i = 1; i <= amount; i++) {
for (int coin : coins) {
if (i - coin >= 0) {
dp[i] = Math.min(dp[i], dp[i - coin] + 1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
}