🔥 个人主页: 黑洞晓威
😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害
279.完全平方数
给你一个整数 n
,返回 和为 n
的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1
、4
、9
和 16
都是完全平方数,而 3
和 11
不是。
示例 1:
输入:n = 12
输出:3
解释:12 = 4 + 4 + 4
示例 2:
输入:n = 13
输出:2
解释:13 = 4 + 9
解题思路
定义一个状态数组 dp
,其中 dp[i]
表示数字 i
的最少完全平方数数量。
初始时,将所有的 dp[i]
设置为 i
,因为最坏情况下,每个数字都可以表示为 i
个 1
的平方和。
然后,我们从 1
开始遍历到 n
,对于每个数字 i
,我们尝试将其表示为一个完全平方数 j*j
和一个数字 i-j*j
的和,其中 j
的取值范围是 1
到 sqrt(i)
。我们更新 dp[i]
的值为 dp[i-j*j] + 1
和 dp[i]
的较小值。
最后返回 dp[n]
即可得到和为 n
的完全平方数的最少数量。
代码实现
public class PerfectSquares {
public int numSquares(int n) {
int[] dp = new int[n + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
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];
}
public static void main(String[] args) {
PerfectSquares solution = new PerfectSquares();
// Test Cases
int n1 = 12;
int n2 = 13;
System.out.println("Minimum number of perfect squares for " + n1 + ": " + solution.numSquares(n1));
System.out.println("Minimum number of perfect squares for " + n2 + ": " + solution.numSquares(n2));
}
}
322. 零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
你可以认为每种硬币的数量是无限的。
示例 1:
- 输入:coins = [1, 2, 5], amount = 11
- 输出:3
- 解释:11 = 5 + 5 + 1
示例 2:
- 输入:coins = [2], amount = 3
- 输出:-1
示例 3:
- 输入:coins = [1], amount = 0
- 输出:0
示例 4:
- 输入:coins = [1], amount = 1
- 输出:1
示例 5:
- 输入:coins = [1], amount = 2
- 输出:2
解题思路
定义一个状态数组 dp
,其中 dp[i]
表示凑齐金额 i
所需的最少硬币数量。初始时,将所有的 dp[i]
设置为一个较大的值,比如 amount + 1
,表示最坏情况下无法凑齐金额 i
。
然后,我们从 1
开始遍历到 amount
,对于每个金额 i
,我们遍历硬币数组 coins
,对于每个硬币 coin
,如果 coin <= i
,说明可以使用该硬币凑齐金额 i
,则更新 dp[i]
的值为 dp[i - coin] + 1
和 dp[i]
的较小值。
最后返回 dp[amount]
即可得到凑齐总金额所需的最少硬币数量。
代码实现
public class CoinChange {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount + 1];
Arrays.fill(dp, amount + 1);
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int coin : coins) {
if (coin <= i) {
dp[i] = Math.min(dp[i], dp[i - coin] + 1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
public static void main(String[] args) {
CoinChange solution = new CoinChange();
// Test Cases
int[] coins1 = {1, 2, 5};
int amount1 = 11;
int[] coins2 = {2};
int amount2 = 3;
int[] coins3 = {1};
int amount3 = 0;
int[] coins4 = {1};
int amount4 = 1;
int[] coins5 = {1};
int amount5 = 2;
System.out.println("Minimum number of coins for amount " + amount1 + ": " + solution.coinChange(coins1, amount1));
System.out.println("Minimum number of coins for amount " + amount2 + ": " + solution.coinChange(coins2, amount2));
System.out.println("Minimum number of coins for amount " + amount3 + ": " + solution.coinChange(coins3, amount3));
System.out.println("Minimum number of coins for amount " + amount4 + ": " + solution.coinChange(coins4, amount4));
System.out.println("Minimum number of coins for amount " + amount5 + ": " + solution.coinChange(coins5, amount5));
}
}