当前位置: 首页 > news >正文

力扣热题100-----118.杨辉三角

案例

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:

输入: numRows = 1
输出: [[1]]

提示:

1 <= numRows <= 30

思路: 我们运用动态规划法 我们先生成第一行 因为第一行只有一个数字那就是1 然后我们需要找到他的状态转移方程 也就是当前这一行的除了第一个和最后一个 都为他的上一排的前一个和第二个的和 所以要我们就得出他的状态转移方程 down.get[j]=up.get(j-1)+up.get(j) 最后返回list

  1. 定义状态:• 使用数组 list ,其中 first表示第一行。
  2. 初始化状态:first=1
  3. 状态转移:• 对于 第二行 ,根据状态转移方程更新:
    状态转移方程就为down.get(j)=up.get(j-1)+up.get(j)
  4. 计算顺序:• 从第 2 层开始,逐步计算到第 n 层 将他依次添加到list中。
  5. 返回结果:• 最终结果为 list 。
class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> list= new ArrayList<>();//生成第一行List<Integer> first=new ArrayList<>();first.add(1);list.add(first);//逐行生成for(int i=1;i<numRows;i++){List<Integer> down=new ArrayList<>();List<Integer> up=list.get(i-1);down.add(1);//第一个数字是1for(int j=1;j<i;j++){down.add(up.get(j-1)+up.get(j));}down.add(1);list.add(down);}return list;}
}

动态规划法:

动态规划法介绍:

动态规划(Dynamic Programming,简称 DP)是一种用于解决多阶段决策问题的算法思想,它通过将复杂问题分解为更简单的子问题,并存储这些子问题的解以避免重复计算,从而高效地解决问题。动态规划通常用于优化问题,尤其是那些具有重叠子问题和最优子结构特性的问题。

核心概念

• 最优子结构:

• 一个问题的最优解可以由其子问题的最优解组合而成。换句话说,问题的解可以分解为若干个子问题的解。

• 例如,在爬楼梯问题中,到达第(n)阶的方法数可以由到达第(n-1)阶和第(n-2)阶的方法数组合而成。

• 重叠子问题:

• 在递归求解过程中,同一个子问题会被多次计算。动态规划通过存储这些子问题的解(通常使用一个数组或哈希表),避免重复计算,从而提高效率。

• 例如,在递归计算斐波那契数列时,会多次计算相同的值,而动态规划通过存储这些值来避免重复计算。

动态规划的优势
• 高效性:

• 动态规划通过存储子问题的解,避免了重复计算,大大提高了算法的效率。时间复杂度通常为(O(n))。

• 适用性:

• 动态规划适用于具有重叠子问题和最优子结构特性的问题,如背包问题、最长公共子序列、最短路径问题等。

• 可扩展性:

• 动态规划的思想可以扩展到多维问题,通过增加状态维度来解决更复杂的问题。

动态规划的局限性
• 空间复杂度:

• 动态规划通常需要额外的空间来存储子问题的解,空间复杂度可能较高。例如,爬楼梯问题的空间复杂度为(O(n))。

• 状态转移方程的推导:

• 动态规划的关键在于推导状态转移方程,这需要对问题有深入的理解和分析。

• 适用范围:

• 动态规划只适用于具有重叠子问题和最优子结构特性的问题,对于不符合这些特性的问题,动态规划可能不适用。

总结

动态规划是一种强大的算法思想,通过将复杂问题分解为更简单的子问题,并存储这些子问题的解,避免重复计算,从而高效地解决问题。爬楼梯问题是动态规划的经典应用之一,通过定义状态、初始化状态、状态转移和计算顺序,可以高效地求解问题。

http://www.dtcms.com/a/322790.html

相关文章:

  • Kettle ETL 工具存在的问题以及替代方案的探索
  • Arm Development Studio 安全通告:CVE-2025-7427
  • 什么情况下需要JVM调优?
  • Java-file类
  • 力扣 30 天 JavaScript 挑战 第二题笔记
  • 每日算法刷题Day59:8.9:leetcode 队列8道题,用时2h30min
  • 【攻防实战】从外到内全链路攻防实战纪实
  • python---类型别名
  • 1073. 沙漏
  • sqli-labs通关笔记-第40关 GET字符型堆叠注入(单引号括号闭合 手工注入+脚本注入两种方法)
  • J2000平赤道系、瞬时平赤道系与瞬时真赤道系
  • (论文速读)重新思考CNN生成网络中的上采样操作
  • 优先队列,链表优化
  • 2025-08-09通过授权码的方式给exe程序充值
  • 如何搭建ELK
  • C# DataGridView 添加进度条
  • 五、RuoYi-Cloud-Plus 前端项目部署以及如何改后端请求地址。
  • 《从零实现哈希表:详解设计、冲突解决与优化》
  • 09 【C++ 初阶】C/C++内存管理
  • 容器技术基础与实践:从镜像管理到自动运行配置全攻略
  • 【机器学习深度学习】模型选型:如何根据模型的参数算出合适的设备匹配?
  • Java 字符流与字节流详解
  • bms部分
  • 系统调用性能剖析在云服务器应用优化中的火焰图生成方法
  • 比亚迪第五代DM技术:AI能耗管理的深度解析与实测验证
  • Klipper-G3圆弧路径算法
  • Android MediaCodec 音视频编解码技术详解
  • 排序概念以及插入排序
  • Docker部署whisper转写模型
  • AI鉴伪技术:守护数字时代的真实性防线