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:
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
就,很普通的帕斯卡三角,就按照规律写就行了,主要就是注意边界条件吧。自己写了个不太简洁的,但是是按照我自己的思维逻辑写的,逻辑很直观。
Runtime: 1 ms, faster than 81.76% of Java online submissions for Pascal's Triangle.
Memory Usage: 41.9 MB, less than 38.22% of Java online submissions for Pascal's Triangle.
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> first = new ArrayList<>();
first.add(1);
result.add(first);
for (int i = 1; i < numRows; i++) {
List<Integer> row = new ArrayList<>();
row.add(1);
List<Integer> prev = result.get(i - 1);
for (int j = 0; j < i - 1; j++) {
row.add(prev.get(j) + prev.get(j + 1));
}
row.add(1);
result.add(row);
}
return result;
}
}
然后看了一下discussion的解法,嗯,果然还是有优雅的写法的。首先我上面的解法可以不把单独为1的情况拎出来,两个row.add(1)可以写成一个if (j == 0 || j == i),所以i其实也不用把第一行拎出来了。
class Solution {
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<>();
for (int j = 0; j < i + 1; j++) {
if (j == 0 || j == i) {
row.add(1);
} else {
List<Integer> prev = result.get(i - 1);
row.add(prev.get(j - 1) + prev.get(j));
}
}
result.add(row);
}
return result;
}
}
还有一种解法是复用List<Integer> row,相当于变相保存前一行的结果,动态更新为新的一行,还挺巧妙的但是不那么直观。每次都往row的最前面加一个1,加完以后这个row就是这行的总数了,然后从第二个数字开始,这个数字的新值就应该是这个数字和这个数字后一个之和。最后往外层list加的时候记得new ArrayList<>()因为相当于是传的reference。
Runtime: 1 ms, faster than 81.76% of Java online submissions for Pascal's Triangle.
Memory Usage: 41.6 MB, less than 65.97% of Java online submissions for Pascal's Triangle.
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> row = new ArrayList<>();
for (int i = 0; i < numRows; i++) {
row.add(0, 1); // add to the first index
for (int j = 1; j < row.size() - 1; j++) { // start from the second one, need to add for row.size() - 2 times
row.set(j, row.get(j) + row.get(j + 1)); // row[j] (new) = row[j] + row[j + 1]
}
result.add(new ArrayList<>(row));
}
return result;
}
}