代码随想录算法训练营第四十五天 | 零钱兑换、完全平方数

● 今日学习的文章链接和视频链接

题目322. 零钱兑换
题目279. 完全平方数

● 看到题目的第一想法

还是背包

● 看完代码随想录之后的想法

背包问题解法都很相似,主要是处理背包和物品的关系

● 实现过程中遇到哪些困难

no time

● 解题代码

  1. 点击查看代码
    class Solution {
    	public int coinChange(int[] coins, int amount) {
    		int max = Integer.MAX_VALUE;
    		int[] dp = new int[amount + 1];
    		//初始化dp数组为最大值
    		for (int j = 0; j < dp.length; j++) {
    			dp[j] = max;
    		}
    		//当金额为0时需要的硬币数目为0
    		dp[0] = 0;
    		for (int i = 0; i < coins.length; i++) {
    			//正序遍历:完全背包每个硬币可以选择多次
    			for (int j = coins[i]; j <= amount; j++) {
    				//只有dp[j-coins[i]]不是初始最大值时,该位才有选择的必要
    				if (dp[j - coins[i]] != max) {
    					//选择硬币数目最小的情况
    					dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);
    				}
    			}
    		}
    		return dp[amount] == max ? -1 : dp[amount];
    	}
    }
    
  2. 点击查看代码
    class Solution {
    	// 版本二, 先遍历背包, 再遍历物品
    	public int numSquares(int n) {
    		int max = Integer.MAX_VALUE;
    		int[] dp = new int[n + 1];
    		// 初始化
    		for (int j = 0; j <= n; j++) {
    			dp[j] = max;
    		}
    		// 当和为0时,组合的个数为0
    		dp[0] = 0;
    		// 遍历背包
    		for (int j = 1; j <= n; j++) {
    			// 遍历物品
    			for (int i = 1; i * i <= j; i++) {
    				dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
    			}
    		}
    		return dp[n];
    	}
    }
    

● 今日收获,学习时长

今日收获:背包问题
学习时长:1h
posted @ 2024-01-12 13:51  雨年今天有记录吗  阅读(0)  评论(0)    收藏  举报