leetcode刷题-118杨辉三角

137 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

leetcode118-杨辉三角

前文

本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。

题目信息

给定一个非负整数 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

杨辉三角作为编程界的入门题目,想必和helloworld一样经典。几乎所有的程序员在学习编程时都要练习杨辉三角的相关编程题目。杨辉三角本身是一个数学上的公式,也就是下一行的值等于上一行对应的两个数相加的和,而每一行最边两个数组均为1.由于这个特性可以分析出杨辉三角第一行和第二行具有特殊的性质,尤其是第一行。因此本题的解题思路为先定义一个二维数组,数组内容为每一行的值。而每一行的值又是一个数组类型,内容为杨辉三角的值。利用所需行数目作为循环的次数,每次循环生成对应行的值。同时对于0和1进行特殊处理。每一行都通过前一行计算,计算后再补足需要的1.则生成对应的杨辉三角形。 代码如下:

List<List<Integer>> result = new ArrayList();
public List<List<Integer>> generate(int numRows) {
    for (int i = 0; i < numRows; i++) {
        if(i == 0){
                List<Integer> item = new ArrayList<>();
                item.add(1);
                result.add(item);
        }else if(i == 1){
                List<Integer> item = new ArrayList<>();
                item.add(1);
                item.add(1);
                result.add(item);
        }else{
            Integer past = -1;
            List<Integer> item = new ArrayList<>();
            for (int j = 0; j < result.get(i - 1).size(); j++) {
                if(j == 0){
                    item.add(result.get(i - 1).get(j));
                }else{
                    item.add(result.get(i - 1).get(j) + past);
                }
                past = result.get(i - 1).get(j);
            }
            item.add(1);
            result.add(item);
        }
    }
    return result;
}

复杂度分析

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。