Pascal Triangle I/II
- Easy
- keyword: Math
- 类似: Best meeting point, count digits
2道相关的题目, 即构造出杨辉三角.
第一题
- 这个题目直接iteration即可. 通过使用result里最后的list, 构造当前的list, 注意首尾加上一个1, 中间的就是通过上层的2个相邻的数相加得到.
- 代码如下. 注意ArrayList/Linkedlist的set/add的复杂度.
public List<List<Integer>> generateTTT(int numRows) {
List<List<Integer>> result = new ArrayList<>();
if (numRows < 1) return result;
if (numRows >= 1) {
List<Integer> tmp = new ArrayList<>();
tmp.add(1);
result.add(tmp);
}
if (numRows >= 2) {
List<Integer> tmp = new ArrayList<>();
tmp.add(1);
tmp.add(1);
result.add(tmp);
}
if (numRows >= 3) {
for (int r = 3; r <= numRows; ++r) {
List<Integer> tmp = new ArrayList<>();
tmp.add(1);
for (int c = 1; c < r - 1; ++c) {
int val = result.get(r - 2).get(c - 1) + result.get(r - 2).get(c);
tmp.add(val);
}
tmp.add(1);
result.add(tmp);
}
}
//helper(result, tmp, 1, numRows);
return result;
}
第二题
- 使用O(k)的空间, 得到第k层.
- 这里我是看了discuss一个同学对第一题的解, 从而做出来的. 这里利用一个性质: 每次将上一层的头部加一个1, 然后两两相加即可得到当前层.
例如:
- [1, 1] => [1,1,1] => [1, 1+1, 1] => [1,2,1].
- [1,2,1] => [1,1,2,1] => [1, 1+2, 2+1, 1] => [1,3,3,1].
- [1,3,3,1] => [1,1,3,3,1] => [1,1+3,3+3,3+1,1] => [1,4,6,4,1].
代码如下:
public List<Integer> getRow(int rowIndex) {
List<Integer> row = new ArrayList<>();
for (int i = 0; i <= rowIndex; ++i) {
row.add(0, 1);
for (int j = 1; j < row.size()-1; ++j) {
row.set(j, row.get(j) + row.get(j + 1));
}
}
return row;
}
总结
- 这有点像count digits, best meeting point, rotate graph. 都是找到性质, 从而直接解决问题. best meeting point是发现Median是解, rotate graph是知道公式, count digits是分析出3种情况, 乃至所有DP是找到关系(例如BTBSS IV, house robber(九章解法)).
- 这里第二题的公式确实不太可能想出来, 只有知道了才会写.