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

从递归到数学规律:我是怎么把杨辉三角写对的

🟢 题目速览

LeetCode 118. 杨辉三角(简单)

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

规则很简单:

  • 每个数是它左上方和右上方的数的和。

  • 每行第一个和最后一个都是 1。

示例:

输入: 5 输出: [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]

🧠 我的第一反应(差点翻车)

看到这种二维结构,我第一反应是:这不就是个二维 List 嘛,直接套两层循环。

于是我写出了大概这样的逻辑:

  1. 外层循环控制行数。

  2. 内层循环给每一行塞数。

  3. 如果是第一个或最后一个,塞 1。

  4. 否则,去上一行拿数相加。

结果一跑,直接给我报了个IndexOutOfBoundsException

我当时一脸懵:“我不是已经判断了j == 0 || j == i了吗?怎么还会越界?”


🔍 排查过程(关键坑点)

后来我盯着代码看了十分钟,终于发现问题出在这:

我把result.add(row)写在内层循环里了。

也就是说,每算一个数,我就把整行加了一遍。

  • 算第 0 个:加一次 row

  • 算第 1 个:又加一次 row

这就导致result里的行数乱了,等到下一行去result.get(i-1)拿上一行数据时,拿到的根本不是我想的那个。

还有一个隐藏问题:

i = 0的时候,如果不特殊处理,第一行会是空的,这也直接导致后面全崩。


🚀 正确的姿势:理清索引关系

冷静下来重新理逻辑,其实杨辉三角的规律非常死板,不需要瞎猜:

  1. 第 i 行有 i + 1 个数(i 从 0 开始)。

  2. 首尾一定是 1

  3. 中间的数 = 上一行[j-1] + 上一行[j]

只要保证:一行算完了,再丢进结果集里,就不会乱。


✅ 最终代码(可直接交)

class Solution { public List<List<Integer>> generate(int numRows) { List<List<Integer>> result = new ArrayList<>(); for (int i = 0; i < numRows; i++) { List<Integer> row = new ArrayList<>(); for (int j = 0; j <= i; j++) { if (j == 0 || j == i) { row.add(1); } else { int left = result.get(i - 1).get(j - 1); int right = result.get(i - 1).get(j); row.add(left + right); } } // ✅ 关键:一行结束了再 add result.add(row); } return result; } }

🔍 执行过程拆解(n = 5)

行号 i

计算过程

当前行

0

只有一个 1

[1]

1

1 + 1

[1, 1]

2

1, (1+1), 1

[1, 2, 1]

3

1, (1+2), (2+1), 1

[1, 3, 3, 1]

4

1, (1+3), (3+3), (3+1), 1

[1, 4, 6, 4, 1]


🎯 我踩过的坑(避坑指南)

  1. 别急着往结果里加

    • ❌ 内层循环里add(row)

    • ✅ 外层循环结束再add(row)

  2. 边界一定要死记

    • 第一行必须是[1]

    • 每一行第一个和最后一个一定是1

  3. 索引别写反

    • result.get(i - 1)才是上一行

    • j - 1j别搞混


🧩 一句话总结

杨辉三角看似是数学题,其实是数组索引控制题

只要你记住:一行算完再存,首尾填 1,中间去上一行拿数,这题就稳了。


🎤 面试怎么说(建议背)

“这题我用模拟的方式来做。

用一个二维 List 存储结果,外层循环控制行数。

每一行第一个和最后一个元素固定为 1,中间的元素通过上一行的两个相邻元素相加得到。

注意要把整行构造完成后再加入结果集,避免索引错乱。”


写完这篇我才发现,很多题不是难,而是我们太着急下手写了

先画图,再写代码,真的能救命。

http://www.jsqmd.com/news/855810/

相关文章:

  • 如何在5分钟内搭建专业的电子实验室笔记本系统:eLabFTW完整指南
  • GitHub Desktop中文汉化神器:3分钟让你的Git操作界面说中文
  • 如何在5分钟内快速上手face-detection-tflite:Python轻量级人脸检测与虹膜追踪终极指南
  • 计算机毕业设计Python+AI大模型空气质量预测分析(可定制城市) 空气质量可视化 空气质量爬虫 机器学习 深度学习 大 数据毕业设计
  • B站直播助手技术解析:从弹幕处理引擎到自动化场控架构
  • 告别复杂绘图软件:用纯文本快速创建专业图表的终极指南
  • SPlisHSPlasH ParaView插件安装与使用:可视化分析模拟结果的最佳实践
  • 解决JDK卸载后重新安装时打不开安装程序的问题
  • DeepCTR深度学习CTR模型:5个核心技巧快速构建高效推荐系统
  • 3分钟搞定多版本PHP环境管理:phpenv终极指南 [特殊字符]
  • 保姆级教程:用Webpack打包你的第一个Cesium项目(附50个Demo源码下载)
  • 基于SSM的在线预约导游系统(10068)
  • longman communication 3000 9000
  • LDDC终极指南:如何快速获取精准歌词,让你的音乐体验完美同步![特殊字符]
  • 从递归到 DP:我是怎么把打家劫舍写对的
  • CANN/asc-devkit数据搬运API文档
  • 保姆级教程:用ZStack Cloud 4.6.31镜像,10分钟搞定你的第一个私有云实验环境
  • YimMenu:GTA5终极安全防护与游戏体验优化完整指南
  • PyTorch实战(35)——使用PyTorch Profiler分析模型推理性能
  • 轻量级人脸检测方案:解决移动端AI视觉部署的核心痛点
  • SegFormer凭什么不用位置编码?深入拆解Mix-FFN与重叠Patch Merging的设计哲学
  • PS4模拟器完整指南:shadPS4免费畅玩主机游戏教程
  • Windows字体自定义终极指南:用No!! MeiryoUI打造你的专属界面
  • 别再傻傻分不清了!5分钟搞懂NMOS和PMOS在电路里的正确接法(附选型避坑指南)
  • 如何用Text-to-CAD UI在5分钟内从文字描述创建专业3D模型:技术实现全解析
  • WSLg完整使用指南:让Linux图形应用在Windows上无缝运行
  • 知网 AI 率秒清零!2026 学生首选降知网 AI 工具!
  • 如何在macOS上轻松绕过限制制作Windows启动盘:完整免费指南
  • 如何在macOS上免费实现光标个性化:5步完成终极美化指南
  • 2026年238个好发CCF-A的强化学习idea全面汇总!