OJ练习LeetCode-118:杨辉三角

题目 

118. 杨辉三角 - 力扣(LeetCode)

OJ练习LeetCode-118:杨辉三角_第1张图片

OJ练习LeetCode-118:杨辉三角_第2张图片 

 可以看到,默认的代码块中出现List>为二级ArrayList,类似于数组中的二维数组。List<元素类型>

在List>中,元素类型为List

在List中,元素类型为Integer。

即每一行为一个线性表,线性表中的元素为Integer类型,最终的杨辉三角也是一个线性表,元素类型为每一行的线性表。

思路 

 接下来,我们分析一下题目:

1.在杨辉三角中,第一行只有一个元素,为数字1;

2.第二行只有两个元素,均为1;

3.第三行有三个元素,为1,2,1(中间的数字2为上一行的两个1相加得到);

4.第四行有四个元素,为1,3,3,1(从第三行开始,需要运算得到的数为当前行数的下标-1,即内层循环为j < i); 

.......

OJ练习LeetCode-118:杨辉三角_第3张图片

 假设我们有i行,j列,那么每一行的第一个元素和最后一个元素均为1,且第i行的第j个元素就等于i-1行的第j个元素和第j-1个元素之和。

即array[ i ][ j ] = array[ i - 1 ][ j ] + array[ i - 1 ][ j - 1 ]

完整代码

class Solution {
    public List> generate(int numRows) {
        //根据题目已知,numRows为行数
        if(numRows == 1){
            //构建一个新的线性表用来存放最终的结果
            List> ans = new ArrayList<>();
            //构建一个新的线性表用来存放每一行的元素
            List row = new ArrayList<>();
            //将元素1放入第一行中
            row.add(1);
            //将第一行放入最终的线性表中
            ans.add(row);

            return ans;
        }
        if(numRows == 2){
            //有两行时,先把第一行的线性表加入,再将第二行的线性表加入
            List> ans = new ArrayList<>();
            List row = new ArrayList<>();
            row.add(1);     
            ans.add(row);   //第一行的线性表加入到最终的线性表中

            row = new ArrayList<>();
            row.add(1);
            row.add(1);
            ans.add(row);   //第二行的线性表加入到最终的线性表中

            return ans;
        }
        //从第三行开始,中间的元素需要经过运算得出
        List> ans = new ArrayList<>();
        List row = new ArrayList<>();
        row.add(1);     
        ans.add(row);   //第一行的线性表加入到最终的线性表中

        row = new ArrayList<>();
        row.add(1);
        row.add(1);
        ans.add(row);   //第二行的线性表加入到最终的线性表中
        //第三行开始下标为2
        for(int i = 2;i < numRows;i++){
            row = new ArrayList<>();
            row.add(1);
            List lastRow = ans.get(i-1);    //得到上一行的元素
            for(int j = 1;j < i;j++){
                int a = lastRow.get(j);
                int b = lastRow.get(j - 1);
                row.add(a + b);
            }
            row.add(1); //将最后一个元素1放在整行最后
            ans.add(row);   //将这一行线性表加入到最终结果中    
        } 
        return ans;
    }
}

代码优化

class Solution {
    public List> generate(int numRows) {
        List> ans = new ArrayList<>();
        List row = new ArrayList<>();
        row.add(1);
        ans.add(row);
        if(numRows == 1){
            return ans;
        }
        
        row = new ArrayList<>();
        row.add(1);
        row.add(1);
        ans.add(row);
        if(numRows == 2){
            return ans;
        }

        //从第三行开始(下标为2)
        for (int i = 2; i < numRows; i++) {
            row = new ArrayList<>();
            row.add(1);       //添加每一行第一个元素为1
            List lastrow = ans.get(i-1);   //得到上一行的元素
            //从每一行第二个元素开始(下标为1)
            //从第三行开始,需要运算得到的数为当前行数的下标-1
            for (int j = 1; j < i; j++) {
                int a = lastrow.get(j);
                int b = lastrow.get(j -1);
                row.add(a + b);
            }
            row.add(1);
            ans.add(row);
        }
        return ans;
    }
}

你可能感兴趣的:(OJ练习,leetcode,算法,java)