LeetCode # Array # Easy #118. Pascal's Triangle && 119. Pascal's Triangle II

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 }

 

posted @ 2018-05-03 22:11  何以解忧,唯有撸代码  阅读(130)  评论(0编辑  收藏  举报