题目
Given a non-negative integer numRows, generate the first numRows of Pascal’s triangle.
Example:
Input: 5
Output:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
我的想法
头尾直接置1,其他的a[i][j] = a[i-1][j-1]+a[i-1][j]。但是这样复杂度会达到 n 2 n^2 n2
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> triangle = new ArrayList<List<Integer>>();
if (numRows == 0) return triangle;
triangle.add(new ArrayList<>());
triangle.get(0).add(1);
for(int i = 1; i < numRows; i++){
triangle.add(new ArrayList<>());
List<Integer> curRow = triangle.get(i);
List<Integer> preRow = triangle.get(i-1);
for(int j = 0; j <= i; j++){
if(j == 0 || j == i){
curRow.add(1);
}
else{
int addItem = preRow.get(j-1) + preRow.get(j);
curRow.add(addItem);
}
}
}
return triangle;
}
}
解答
leetcode solution: Dynamic Programming
和我的做法是一样的
因为构建当前行需要用到前一行,所以是个动态规划的问题
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> triangle = new ArrayList<List<Integer>>();
if (numRows == 0) {
return triangle;
}
// first row is always [1].
triangle.add(new ArrayList<>());
triangle.get(0).add(1);
for (int rowNum = 1; rowNum < numRows; rowNum++) {
List<Integer> row = new ArrayList<>();
List<Integer> prevRow = triangle.get(rowNum-1);
// The first row element is always 1.
row.add(1);
for (int j = 1; j < rowNum; j++) {
row.add(prevRow.get(j-1) + prevRow.get(j));
}
// The last row element is always 1.
row.add(1);
triangle.add(row);
}
return triangle;
}
}