118 题目:又叫“杨辉三角形”
Given a non-negative integer numRows, generate the first numRows of Pascal's triangle.
In Pascal's triangle, each number is the sum of the two numbers directly above it.
思路:用动态规划。首先,第0行的数字为1;其次,每行的第一个和最后一个为1;最后,其他的值为他的上一行左边+上一行右边(与其接壤)的值。
具体做法:将三角形看做一个大列表,每行作为一个行列表存储在大列表中。
1 class Solution { 2 public List<List<Integer>> generate(int numRows) { 3 List<List<Integer>> triangle = new ArrayList<List<Integer>>();//存储整个三角形,其中每行也是一个整型列表。 4 if(numRows == 0){//当要求0行,则输出空的列表; 5 return triangle; 6 } 7 triangle.add(new ArrayList<>());//第一行永为1 8 triangle.get(0).add(1); 9 for(int numRow = 1; numRow < numRows; numRow ++){ 10 List<Integer> row = new ArrayList<>(); 11 List<Integer> prevrow = triangle.get(numRow-1); 12 row.add(1);//每行第一个=1 13 for(int j =1; j < numRow ; j++){ 14 row.add(prevrow.get(j-1)+prevrow.get(j));//中间的元素等于上一行左右两个的和; 15 } 16 row.add(1);//每行最后一个=1; 17 triangle.add(row); 18 } 19 return triangle; 20 } 21 }
119:在上题基础了修改,三角形行数从0开始,且输出的是第K行的列表,要求辅助空间大小为O(K);
思路:只需要保存当前行和上一行的信息,输出时输出当前行。
1 class Solution { 2 public List<Integer> getRow(int rowIndex) { 3 List<Integer> row = new ArrayList<>();//当前行 4 List<Integer> prevRow ;//上一行 5 if(rowIndex == 0){//0行只有1 6 row.add(1); 7 } 8 for(int numRow = 1; numRow <=rowIndex; numRow ++){ 9 prevRow = row; //前一行== 上一次循环后的row 10 row = new ArrayList<>();//重新计算当前行 11 row.add(1); 12 for(int j =1; j < numRow ; j++){ 13 row.add(prevRow.get(j-1)+prevRow.get(j)); 14 } 15 row.add(1); 16 } 17 return row; 18 } 19 }