LeetCode Top Interview Questions 118. Pascal’s Triangle (Java版; Easy)
题目描述
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.
Example:
Input: 5
Output:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
第一次做; 完全复现杨辉三角形的计算过程; 索引还是从0开始吧, 别从1开始, 细心点; 推荐下面的动态规划解法
import java. util. List;
import java. util. ArrayList;
class Solution {
public List< List< Integer> > generate ( int numRows) {
List< List< Integer> > res = new ArrayList < > ( ) ;
if ( numRows< 1 )
return res;
List< Integer> tmp;
for ( int i= 0 ; i< numRows; i++ ) {
tmp = new ArrayList < > ( ) ;
for ( int j= 0 ; j<= i; j++ ) {
if ( j== 0 || j== i)
tmp. add ( 1 ) ;
else {
tmp. add ( j, res. get ( i- 1 ) . get ( j- 1 ) + res. get ( i- 1 ) . get ( j) ) ;
}
}
res. add ( new ArrayList < Integer> ( tmp) ) ;
}
return res;
}
}
第一次做; 按照下面LeetCode动态规划解的思想写了一遍; 我最开始思考这道题的时候, 比较难下手的原因是因为计算当前行的值需要上一行的值, 如何获取上一行的值? 这里直接把上一行的结果经过简单的处理, 就是在index=0处加入1, 然后根据这个简单处理后的结果计算新一行的结果; 接着再简单处理新一行的结果, 以此类推; 非常巧妙! 看下面的力扣图, 之所以要add(0,1),是因为每一行的第一个数都是1, 并且每一行的第二个数的一个加数一定是1, 所以加入一个1让其作为新的开头, 第二个1用来计算
import java. util. List;
import java. util. ArrayList;
class Solution {
public List< List< Integer> > generate ( int numRows) {
List< List< Integer> > res = new ArrayList < > ( ) ;
if ( numRows< 1 )
return res;
List< Integer> tmp = new ArrayList < > ( ) ;
for ( int i= 0 ; i< numRows; i++ ) {
tmp. add ( 0 , 1 ) ;
for ( int j= 1 ; j<= tmp. size ( ) - 2 ; j++ ) {
tmp. set ( j, tmp. get ( j) + tmp. get ( j+ 1 ) ) ;
}
res. add ( new ArrayList < Integer> ( tmp) ) ;
}
return res;
}
}
LeetCode优秀题解 ; 动态规划, 看上面的图,想清楚为什么要add(0,1), 这跟杨辉三角形的计算过程有关
计算过程:
1
1 1
1 1 1 → 1 2 1
1 1 2 1 → 1 3 3 1
1 1 3 3 1 → 1 4 6 4 1
public class Solution {
public List< List< Integer> > generate ( int numRows) {
List< List< Integer> > allrows = new ArrayList < List< Integer> > ( ) ;
ArrayList< Integer> row = new ArrayList < Integer> ( ) ;
for ( int i= 0 ; i< numRows; i++ )
{
row. add ( 0 , 1 ) ;
for ( int j= 1 ; j< row. size ( ) - 1 ; j++ )
row. set ( j, row. get ( j) + row. get ( j+ 1 ) ) ;
allrows. add ( new ArrayList < Integer> ( row) ) ;
}
return allrows;
}
}
class Solution {
public List< List< Integer> > generate ( int numRows) {
List< List< Integer> > result = new ArrayList < > ( ) ;
for ( int i = 0 ; i < numRows; i++ ) {
List< Integer> list = new ArrayList < > ( ) ;
for ( int j = 0 ; j < i + 1 ; j++ ) {
if ( j == 0 || j == i) {
list. add ( 1 ) ;
}
else {
int a = result. get ( i - 1 ) . get ( j - 1 ) ;
int b = result. get ( i - 1 ) . get ( j) ;
list. add ( a + b) ;
}
}
result. add ( list) ;
}
return result;
}
}