LeetCode 118 生成杨辉三角(Pascal’s Triangle)
小白渣翻译
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
例子
这里是小白理解
那么这种题目一上来看,其实题目描述的还是很清晰了,还配了一个动图增加效果,总之就是让你看的清晰名了。
但是这题麻烦就在于得需要每个结果都和上一层有关系,这时候黑长直女神过来问:小白,你这题怎么思考的啊?
小白内心镇定:这题,白月光啊,哦,不对,小美,咱得用Recursion啊,这题才能做。
- 递归方法通过递归调用生成前一行,然后在此基础上生成当前行,从而生成杨辉三角形。
第一步,咱们要有个Base case吧,如果给的numRows为1,就返回 [[1]]。
第二步,递归生成每一行
- 进行递归调用以生成前 numRows - 1 行。
- 根据列表中的最后一行生成第 numRows 行。
第三步,添加新行后返回三角形。
小美:小伙子,可以啊,这不仅逻辑感人,阅读理解也有俩下子!
真正面试环节
面试官:你可以解答这道”杨辉三角“的题目吗,来看看你对数学的理解
小白:嘿嘿,这不巧了么这不是
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<>();
generateRow(i, row);
result.add(row);
}
return result;
}
private void generateRow(int rowNum, List<Integer> row) {
if (rowNum == 0) {
row.add(1);
} else {
List<Integer> prevRow = new ArrayList<>();
generateRow(rowNum - 1, prevRow);
// 第一个元素总是1
row.add(1);
// 中间元素是前一行对应位置的和
for (int j = 1; j < rowNum; j++) {
row.add(prevRow.get(j - 1) + prevRow.get(j));
}
// 最后一个元素总是1
row.add(1);
}
}
小明:OK,完事儿,等着面试官来表扬自己吧。他肯定会说:小子,你是个好手!工位都给你准备好了,工资你说了算。
面试官:矮油,不错啊,我就是试试你,下边还有一道题接着来。
小明OS:今年这个找工市场,人言洛阳花似锦,偏我来时不逢春。。。不是,这面试官好体力啊!
编码道路漫漫,只要先看脚下的路,徐徐前进即可。