seo优化专员,外贸网站如何优化,wordpress 插件 漏洞,商业展示空间设计案例及赏析一、LeetCode322. 零钱兑换
题目链接#xff1a;322. 零钱兑换
题目描述#xff1a;
给你一个整数数组 coins #xff0c;表示不同面额的硬币#xff1b;以及一个整数 amount #xff0c;表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一…一、LeetCode322. 零钱兑换
题目链接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提示
1 coins.length 121 coins[i] 231 - 10 amount 104
算法分析
题目给出硬币的数量无限所以这是一道完全背包问题。
定义dp数组及下标含义
dp[j]表示凑成金额为j所需的硬币最少个数。
递推公式
dp[j]min(dp[j],dp[j-coins[i]]1)现有硬币coins[i]那么凑成金额为j所需的最少硬币数可有凑成金额为j-coins[i]所需最少硬币数推出。
初始化
因为要求的是最少硬币数所以除dp[0]初始化成0之外其他所有情况都要初始化成最大值。
遍历顺序
先遍历不同面额的硬币在遍历总金额。
打印dp数组进行验证。
代码如下
class Solution {public int coinChange(int[] coins, int amount) {int[] dp new int[amount 1];for(int i 1; i amount 1; i) dp[i] Integer.MAX_VALUE;dp[0] 0;//除了dp[0]其他都初始化成最大值for(int i 0; i coins.length; i) {//遍历每种硬币for(int j coins[i]; j amount; j) {//遍历总金额if(dp[j - coins[i]] ! Integer.MAX_VALUE) {//注意如果dp[j-coins[i]]是个最大int类型整数的话dp[j-coins[i]]1会溢出变成负数从而影响比较结果所以只有它不是初始最大值是才有选择的必要。dp[j] Math.min(dp[j], dp[j - coins[i]] 1);}}}return dp[amount] Integer.MAX_VALUE ? -1 : dp[amount];}
}
二、LeetCode279. 完全平方数
题目链接279. 完全平方数
题目描述
给你一个整数 n 返回 和为 n 的完全平方数的最少数量 。
完全平方数 是一个整数其值等于另一个整数的平方换句话说其值等于一个整数自乘的积。例如1、4、9 和 16 都是完全平方数而 3 和 11 不是。 示例 1
输入n 12
输出3
解释12 4 4 4
示例 2
输入n 13
输出2
解释13 4 9 提示
1 n 104
算法分析
因为每个完全平方数可以无限取所以这也是一道完全背包问题。
定义dp数组及下标含义:
dp[j]表示组成和为j的完全平方数最少数量。
递推公式
dp[j]min(dp[j],dp[j-i*i]1)现有完全平方数i*i那么组成j的最少完全平方数数量可有dp[j-i*i]推导而出也即组成j-i*i的最少完全平方数数量加上现在这个完全平方数i*i。
初始化
因为要求的是完全平方数最少数量所以除dp[0]初始化成0外其他所有情况都要初始化成最大值。
遍历顺序
先遍历小于等于目标和n的每个完全平方数在遍历总和。
打印dp数组进行验证。
代码如下
class Solution {public int numSquares(int n) {int[] dp new int[n 1];//除dp[0]意外其他所有情况都初始化成最大值dp[0] 0;for(int i 1; i n; i)dp[i] Integer.MAX_VALUE;for(int i 1; i * i n; i) {//遍历每个完全平方数for(int j i * i; j n; j) {//遍历总和dp[j] Math.min(dp[j],dp[j-i * i] 1);}}return dp[n];}
}
总结
这两道题都是完全背包问题中求最少元素个数的情况。