I:
Given numRows, generate the first numRows of Pascal's triangle.
For example, given numRows = 5,
Return
[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]
II:
Given an index k, return the kth row of the Pascal's triangle.
For example, given k = 3,
Return [1,3,3,1]
.
Note:
Could you optimize your algorithm to use only O(k) extra space?
算法,都可以根据上一层算出下一层。如果要II里面的O(k) space,可以用一个滚动的高度为2的二维数组来节省空间,因为每次只和前一次的内容有关,不需要存储太久远的内容。
实现:
题目 I
class Solution { public List<List<Integer>> generate(int numRows) { List<List<Integer>> result = new ArrayList<>(); if (numRows < 1) { return result; } List<Integer> crt = new ArrayList<>(); crt.add(1); result.add(crt); for (int i = 1; i < numRows; i++) { List<Integer> prev = result.get(result.size() - 1); crt = new ArrayList<Integer>(); crt.add(1); for (int j = 0; j < prev.size() - 1; j++) { crt.add(prev.get(j) + prev.get(j + 1)); } crt.add(1); result.add(crt); } return result; } }
题目II
class Solution { public List<Integer> getRow(int rowIndex) { List<Integer> result = new ArrayList<Integer>(); int[][] a = new int[2][rowIndex + 1]; a[0][0] = 1; for (int i = 1; i <= rowIndex; i++) { a[i % 2][0] = 1; for (int j = 1; j <= i; j++) { a[i % 2][j] = a[(i + 1) % 2][j - 1] + a[(i + 1) % 2][j]; } } for (int i = 0; i < rowIndex + 1; i++) { result.add(a[rowIndex % 2][i]); } return result; } }