OJ练习LeetCode-118:杨辉三角

题目 

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

 

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

在List<List<Integer>>中,元素类型为List<Integer>;

在List<Integer>中,元素类型为Integer。

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

思路 

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

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

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

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

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

.......

 假设我们有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<List<Integer>> generate(int numRows) {
        //根据题目已知,numRows为行数
        if(numRows == 1){
            //构建一个新的线性表用来存放最终的结果
            List<List<Integer>> ans = new ArrayList<>();
            //构建一个新的线性表用来存放每一行的元素
            List<Integer> row = new ArrayList<>();
            //将元素1放入第一行中
            row.add(1);
            //将第一行放入最终的线性表中
            ans.add(row);

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

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

            return ans;
        }
        //从第三行开始,中间的元素需要经过运算得出
        List<List<Integer>> ans = new ArrayList<>();
        List<Integer> 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<Integer> 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<List<Integer>> generate(int numRows) {
        List<List<Integer>> ans = new ArrayList<>();
        List<Integer> 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<Integer> 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;
    }
}

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值