题目
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle
解法一:
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
List<Integer> list=new ArrayList<Integer>();
if(numRows>=1){
list.add(1);
result.add(list);
}
if(numRows>=2){
list=new ArrayList<Integer>();
list.add(1);
list.add(1);
result.add(list);
}
if(numRows>=3){
for(int i=2;i<numRows;i++){
List<Integer> temp=new ArrayList<Integer>();
temp.add(1);
for(int j=0;j<i-1;j++){
temp.add(list.get(j)+list.get(j+1));
}
temp.add(1);
result.add(temp);
list=temp;
}
}
return result;
}
}
官方给出了更为简洁的解法,应该注意把不同的情况可以进行归并的进行归并,减少if和else,代码更简洁好看。
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
for(int i=0;i<numRows;i++){
List<Integer> list=new ArrayList<Integer>();
for(int j=0;j<=i;j++){
if(j==0||j==i){
list.add(1);
}
else{
list.add(result.get(i-1).get(j)+result.get(i-1).get(j-1));
}
}
result.add(list);
}
return result;
}
}
还可以利用杨辉三角对称的性质,计算一半的数值即可,另一半进行复制。
题目二:
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
解法一:
class Solution {
public List<Integer> getRow(int rowIndex) {
// List<Integer> result=new ArrayList<Integer>();
List<Integer> temp=new ArrayList<Integer>();
int i;
for(i=0;i<=rowIndex;i++){
List<Integer> list=new ArrayList<Integer>();
for(int j=0;j<=i;j++){
if(j==0||j==i){
list.add(1);
}
else{
list.add(temp.get(j)+temp.get(j-1));
}
}
temp=list;
}
return temp;
}
}
解法二:
直接利用杨辉三角的性质求解
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> temp=new ArrayList<Integer>();
int i;
temp.add(1);
for(i=1;i<=rowIndex;i++){
temp.add((int)((long)temp.get(i-1)*(rowIndex-i+1)/i));
}
return temp;
}
}