LeetCode 118 生成杨辉三角(Pascal’s Triangle)

小白渣翻译

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

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

小白水平理解面试经典题目_数组类LeetCode 118 Pascal‘s Triangle【回归解法】-LMLPHP

例子

小白水平理解面试经典题目_数组类LeetCode 118 Pascal‘s Triangle【回归解法】-LMLPHP

这里是小白理解

那么这种题目一上来看,其实题目描述的还是很清晰了,还配了一个动图增加效果,总之就是让你看的清晰明了。
小白水平理解面试经典题目_数组类LeetCode 118 Pascal‘s Triangle【回归解法】-LMLPHP
但是这题麻烦就在于得需要每个结果都和上一层有关系,这时候黑长直女神过来问:小白,你这题怎么思考的啊?

小白内心镇定:这题,白月光啊,哦,不对,小美,咱得用Recursion啊,这题才能做。

  • 递归方法通过递归调用生成前一行,然后在此基础上生成当前行,从而生成杨辉三角形。

第一步,咱们要有个Base case吧,如果给的numRows为1,就返回 [[1]]。

第二步,递归生成每一行

  • 进行递归调用以生成前 numRows - 1 行。
  • 根据列表中的最后一行生成第 numRows 行。

第三步,添加新行后返回三角形。

小美:小伙子,可以啊,这不仅逻辑感人,阅读理解也有俩下子!
小白水平理解面试经典题目_数组类LeetCode 118 Pascal‘s Triangle【回归解法】-LMLPHP

真正面试环节

面试官:你可以解答这道”杨辉三角“的题目吗,来看看你对数学的理解

小白:嘿嘿,这不巧了么这不是

小白水平理解面试经典题目_数组类LeetCode 118 Pascal‘s Triangle【回归解法】-LMLPHP

     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:今年这个找工市场,人言洛阳花似锦,偏我来时不逢春。。。不是,这面试官好体力啊!

小白水平理解面试经典题目_数组类LeetCode 118 Pascal‘s Triangle【回归解法】-LMLPHP
编码道路漫漫,只要先看脚下的路,徐徐前进即可。

02-02 13:45