从小白开始刷算法 记忆化搜索篇 leetcode.322

简介: 从小白开始刷算法 记忆化搜索篇 leetcode.322

序言

虽然算法很难,但不应该就放弃。这是一个学习笔记,希望你们喜欢~

先自己尝试写,大概十几分钟仍然写不出来

看思路,再尝试跟着思路写

仍然写不出来,再看视频

b站up视频推荐:爱学习的饲养员

leetcode其他文章:

数组篇:

从小白开始刷算法 数组篇 leetcode.485

从小白开始刷算法 数组篇 leetcode.283

从小白开始刷算法 数组篇 leetcode.27

链表篇:

从小白开始刷算法 ListNode 链表篇 leetcode.203

从小白开始刷算法 ListNode 链表篇 leetcode.206

队列篇

从小白开始刷算法 ListNode 链表篇 leetcode.933

栈篇

从小白开始刷算法 Stack 栈篇 leetcode.20

从小白开始刷算法 Stack 栈篇 leetcode.496

哈希篇

从小白开始刷算法 Hash 哈希篇 leetcode.217

从小白开始刷算法 Hash 哈希篇 leetcode.705

树篇

从小白开始刷算法 Tree 树篇 先序遍历 leetcode.144

从小白开始刷算法 Tree 树篇 中序遍历 leetcode.94

从小白开始刷算法 Tree 树篇 后序遍历 leetcode.94

堆篇

从小白开始刷算法 Heap 堆篇 最大堆排序 leetcode.215

小白开始刷算法 Heap 堆篇 最小堆排序 leetcode.692

双指针篇

从小白开始刷算法 对撞双指针 leetcode.881

从小白开始刷算法 快慢双指针篇 leetcode.141

二分法篇

从小白开始刷算法 二分法篇 leetcode.704

从小白开始刷算法 二分法篇 leetcode.35

从小白开始刷算法 二分法篇 leetcode.162

从小白开始刷算法 二分法篇 leetcode.74

滑动窗口篇

从小白开始刷算法 滑动窗口篇 leetcode.209

从小白开始刷算法 滑动窗口篇 leetcode.1456

递归篇

从小白开始刷算法 递归篇 leetcode.509

从小白开始刷算法 递归篇 leetcode.206

分治法篇

从小白开始刷算法 分治法篇 leetcode.169

从小白开始刷算法 分治法篇 leetcode.53

回溯法篇

从小白开始刷算法 回溯法篇 leetcode.22

从小白开始刷算法 回溯法篇 leetcode.78

dfs篇

从小白开始刷算法 dfs篇 leetcode.938

从小白开始刷算法 dfs篇 leetcode.200

bfs篇

从小白开始刷算法 bfs篇 leetcode.102

并查集篇

从小白开始刷算法 并查集篇 leetcode.200

[从小白开始刷算法 并查集篇 leetcode.547

记忆化搜索篇

从小白开始刷算法 记忆化搜索篇 leetcode.547

记忆化搜索篇

难度:中等

题目:

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

题目来源:力扣(LeetCode)

递归+记忆化搜索 思路

能否写出:不能写出。

时间:一个小时起步

思路:

首先,判断如果目标金额amount小于1,则直接返回0,因为无法凑出金额小于等于0的情况。

  1. 创建一个大小为amount+1的记忆数组memo,并初始化所有元素为-1,用于存储每个金额的最少硬币数。
  2. 调用递归函数coinChangeRecursive,传入硬币数组coins、目标金额amount和记忆数组memo
  3. 在递归函数中,首先判断如果目标金额amount小于0,则返回-1,表示无法凑出该金额。
  4. 判断如果目标金额amount等于0,则返回0,表示已经凑出了所需的金额,不需要继续递归。
  5. 检查记忆数组memo,如果当前金额amount的最少硬币数已经计算过,则直接返回该值,避免重复计算。

接下来,初始化一个变量minCount,用于记录当前金额amount的最少硬币数,初始值设为最大整数。

然后,遍历硬币数组coins,对每个硬币进行操作:

  • 计算剩余金额remainingAmount,即目标金额amount减去当前硬币的面值。
  • 递归调用coinChangeRecursive函数,传入剩余金额remainingAmount和记忆数组memo,得到凑齐剩余金额所需的最少硬币数。
  • 如果凑齐剩余金额的最少硬币数不等于-1,表示找到了有效的组合,更新minCount为当前硬币数加上剩余金额的最少硬币数,并取最小值。
  • 重复以上步骤,直到遍历完所有硬币。

最后,将计算得到的最少硬币数存入记忆数组memo中,如果minCount仍然等于初始值,则表示无法凑出目标金额,返回-1;否则返回minCount

// 仅是我的思路代码,leetcode上大神更厉害
class Solution {
  public int coinChange(int[] coins, int amount) {
      if (amount < 1) {
          return 0;
      }
      int[] memo = new int[amount + 1];
      Arrays.fill(memo, -1);
      return coinChangeRecursive(coins, amount, memo);
  }
  private int coinChangeRecursive(int[] coins, int amount, int[] memo) {
      if (amount < 0) {
          return -1;
      }
      if (amount == 0) {
          return 0;
      }
      if (memo[amount] != -1) {
          return memo[amount];
      }
      int minCount = Integer.MAX_VALUE;
      for (int coin : coins) {
          //目标金额amount中减去当前硬币后剩余的金额。
          int remainingAmount = amount - coin;
          //计算凑齐剩余金额所需的最少硬币数
          int count = coinChangeRecursive(coins, remainingAmount, memo);
          //这行代码检查是否找到了一个有效的硬币组合来凑齐剩余金额。
          //如果count不等于-1(表示找到了有效的组合),则继续执行代码来更新minCount
          if (count != -1) {
              //这行代码更新minCount,取最小值,以确保记录最少硬币数的情况。
              //将当前的minCount与count + 1(因为选择了当前硬币,所以硬币数需要加1)进行比较
              minCount = Math.min(minCount, count + 1);
          }
      }
      //存入记忆数组中
      memo[amount] = (minCount == Integer.MAX_VALUE) ? -1 : minCount;
      return memo[amount];
  }
}

时间复杂度:O(MN)

  • 其中M为目标金额,N为硬币种类数,每个金额需要遍历硬币数组。

空间复杂度:O(N)

  • 记忆数组的大小与目标金额N相关
相关文章
|
3月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
223 5
|
3月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
181 0
|
2月前
|
算法 数据可视化 测试技术
HNSW算法实战:用分层图索引替换k-NN暴力搜索
HNSW是一种高效向量检索算法,通过分层图结构实现近似最近邻的对数时间搜索,显著降低查询延迟。相比暴力搜索,它在保持高召回率的同时,将性能提升数十倍,广泛应用于大规模RAG系统。
200 10
HNSW算法实战:用分层图索引替换k-NN暴力搜索
|
6月前
|
机器学习/深度学习 算法 数据挖掘
基于WOA鲸鱼优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB 2022a/2024b实现,采用WOA优化的BiLSTM算法进行序列预测。核心代码包含完整中文注释与操作视频,展示从参数优化到模型训练、预测的全流程。BiLSTM通过前向与后向LSTM结合,有效捕捉序列前后文信息,解决传统RNN梯度消失问题。WOA优化超参数(如学习率、隐藏层神经元数),提升模型性能,避免局部最优解。附有运行效果图预览,最终输出预测值与实际值对比,RMSE评估精度。适合研究时序数据分析与深度学习优化的开发者参考。
|
6月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本内容包含基于BiLSTM与遗传算法(GA)的算法介绍及实现。算法通过MATLAB2022a/2024b运行,核心为优化BiLSTM超参数(如学习率、神经元数量),提升预测性能。LSTM解决传统RNN梯度问题,捕捉长期依赖;BiLSTM双向处理序列,融合前文后文信息,适合全局信息任务。附完整代码(含注释)、操作视频及无水印运行效果预览,适用于股票预测等场景,精度优于单向LSTM。
|
8月前
|
存储 算法 调度
基于和声搜索优化算法的机器工作调度matlab仿真,输出甘特图
本程序基于和声搜索优化算法(Harmony Search, HS),实现机器工作调度的MATLAB仿真,输出甘特图展示调度结果。算法通过模拟音乐家即兴演奏寻找最佳和声的过程,优化任务在不同机器上的执行顺序,以最小化完成时间和最大化资源利用率为目标。程序适用于MATLAB 2022A版本,运行后无水印。核心参数包括和声记忆大小(HMS)等,适应度函数用于建模优化目标。附带完整代码与运行结果展示。
242 24
|
4月前
|
机器学习/深度学习 算法 文件存储
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
神经架构搜索(NAS)正被广泛应用于大模型及语言/视觉模型设计,如LangVision-LoRA-NAS、Jet-Nemotron等。本文回顾NAS核心技术,解析其自动化设计原理,探讨强化学习、进化算法与梯度方法的应用与差异,揭示NAS在大模型时代的潜力与挑战。
1065 6
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
|
2月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
8月前
|
人工智能 自然语言处理 算法
阿里云 AI 搜索开放平台:从算法到业务——AI 搜索驱动企业智能化升级
本文介绍了阿里云 AI 搜索开放平台的技术的特点及其在各行业的应用。
875 3
|
3月前
|
存储 算法 数据可视化
基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真
本程序基于禁忌搜索算法解决旅行商问题(TSP),旨在寻找访问多个城市的最短路径。使用 MATLAB 2022A 编写,包含城市坐标生成、路径优化及结果可视化功能。通过禁忌列表、禁忌长度与藐视准则等机制,提升搜索效率与解的质量,适用于物流配送、路径规划等场景。