[LeetCode] 118. Pascal's Triangle

Given an integer numRows, return the first numRows of Pascal's triangle.

In Pascal's triangle, each number is the sum of the two numbers directly above it as shown:

Example 1:
Example 1
Input: numRows = 5
Output: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

Example 2:
Input: numRows = 1
Output: [[1]]

Constraints:
1 <= numRows <= 30

杨辉三角。

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

思路一 - 暴力模拟

按照题意一行一行把元素写出来然后返回整个三角形。

复杂度

时间 O(n^2)
空间 O(n^2)

代码

Java 实现一

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> firstRow = new ArrayList<>();
        firstRow.add(1);
        res.add(firstRow);
        for (int i = 1; i < numRows; i++) {
            List<Integer> cur = new ArrayList<>();
            // 每一行开头的1
            cur.add(1);
            // 从第二个数字开始,都是找上一行的元素
            // 当前行位置 j 上的数字 = 上一行位置 j - 1 + 上一行位置 j 上的数字
            for (int j = 1; j < i; j++) {
                cur.add(res.get(i - 1).get(j - 1) + res.get(i - 1).get(j));
            }
            // 记得加每行最后一个1
            cur.add(1);
            res.add(cur);
        }
        return res;
    }
}

思路二 - 固定空间

这个三角形注意一下几点

  • 首行只有一个元素 1
  • 每一行的第一个和最后一个元素是 1
  • 每一行的元素个数 = 行的 index。注意 index 是从 1 开始的
  • 中间行位于 index j 的元素 = 上一行位于 j - 1 的元素 + 上一行位于 j 的元素

照着这个思路,我们才能以固定空间复杂度来解决这个问题。这个思路有助于版本二 119 题。

复杂度

时间 O(n^2)
空间 O(k)

代码

Java 实现二 - 固定空间

class Solution {
	public List<List<Integer>> generate(int numRows) {
		List<List<Integer>> res = new ArrayList<>();
		List<Integer> list = new ArrayList<>();
		for (int i = 0; i < numRows; i++) {
			// 头部加1
			list.add(0, 1);
			for (int j = 1; j < list.size() - 1; j++) {
				list.set(j, list.get(j) + list.get(j + 1));
			}
			res.add(new ArrayList<>(list));
		}
		return res;
	}
}

相关题目

118. Pascal's Triangle
119. Pascal's Triangle II
120. Triangle
799. Champagne Tower
2221. Find Triangular Sum of an Array
posted @ 2020-05-14 07:25  CNoodle  阅读(574)  评论(0)    收藏  举报