力扣:118.杨辉三角

107 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

描述

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

解析

根据题意,我们只要理解杨辉三角的几个特性,本题还是很容易解决的,这里说一下我的理解。

  • 杨辉三角的每一行的数量和行号是一致的

  • 每一行的第一位和最后一位的值都是1,并且每行数字左右对称

  • 假如当前是第i行,第j个元素:如果是最外侧的元素,那么这个元素的值都是1,如果是内部的元素,那这个元素的值是第i-1行处的第j位元素和第j-1位元素之和,简单说就是每一个数字都等于上一行左右两个数字之和

    Java解题过程如下:

class Solution {
    public List<List<Integer>> generate(int numRows) {
        //定义结果集
        List<List<Integer>> ret = new ArrayList<List<Integer>>();
        //需要执行的行数
        for (int i = 0; i < numRows; ++i) {
            //定义每一行
            List<Integer> row = new ArrayList<Integer>();
            //内层循环为列
            for (int j = 0; j <= i; ++j) {
                //第一列和最后一列都为1,直接添加到row中
                if (j == 0 || j == i) {
                    row.add(1);
                } else {
                    //非第一和最后一个的数据值是:上一行相同下标及相同下标前一个数据之和
                    row.add(ret.get(i - 1).get(j - 1) + ret.get(i - 1).get(j));
                }
            }
            //添加当前行
            ret.add(row);
        }
        //返回最终结果
        return ret;
    }
}
  • 时间复杂度:O ( numRows*2)。
  • 空间复杂度:O(1)。

运行结果:

执行结果:通过

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:39 MB, 在所有 Java 提交中击败了85.25%的用户