今天是小呆刷题的第 17 天,今天的题目是:力扣(LeetCode)的第 118 题,杨辉三角

题目要求

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

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

杨辉三角

示例:

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

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

提示:

  • 1 <= numRows <= 30

解题思路

这道题其实官方已经给了非常容易理解的规律和图示:每个数是它左上方和右上方的数的和

我们可以用一个二维数组来描述示例 1 的数据:

1
let list = [[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]

根据上面给出的规律能够得出, 首尾的数字一定是 1, 其次从第三行开始,除去首尾,其他的数字都是它左上方和右上方的数的和,所以我们可以做出以下公式:(用i表示行,用j表示列)

  1. list[i][0] = 1 每行的第一个数字是 1
  2. list[i][j] = list[i - 1][j - 1] + list[i - 1][j] 当前行的第j个数等于上一行的j - 1 + 上一行的j
  3. list[i][i] = 1 每行的最后一个数字是 1

不难看出,这道题其实用动态规划就可以解决:(本题动态 gif 图直接看上面给的官方图即可)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* @param {number} numRows
* @return {number[][]}
*/
var generate = function (numRows) {
let ans = []
for (let i = 0; i < numRows; i++) {
ans[i] = [1] // 每一行的第一个数都是1
for (let j = 1; j < i; j++) {
ans[i][j] = ans[i - 1][j - 1] + ans[i - 1][j] // 当前行的第j个数等于上一行的j - 1 + 上一行的j
}
ans[i][i] = 1 // 每一行的最后一个数都是1
}
return ans
}

小结

刷题也有大半个月了,目前大部分题目都是刷的 LeetCode 热门 100 题,目前来看,简单难度的题目仔细思考还是能做出来的,但是看了几道中等难度的题目,基本上没思路的居多。只能先把同类型的简单题目多练习练习再去尝试中等难度的题目了。加油吧!

引用

力扣 LeetCode 的第 118 题-杨辉三角