leetcode 118.杨辉三角 119.杨辉三角 ||(动态规划、List、java)

118.杨辉三角
动态规划通过row.add(prevRow.get(j-1) + prevRow.get(j))来复用计算。
官答。除去==0的特殊情况,其他情况都包含第一行。

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> triangle = new ArrayList<List<Integer>>();  //需要返回的直接定义出来,总不能放for代码段里吧。。。。

        // First base case; if user requests zero rows, they get zero rows.
        if (numRows == 0) {		//特殊情况
            return triangle;
        }

        // Second base case; first row is always [1].
        triangle.add(new ArrayList<>());
        triangle.get(0).add(1);		//剩余情况第一行为1

        for (int rowNum = 1; rowNum < numRows; rowNum++) {
            List<Integer> row = new ArrayList<>();	//每次for循环生成一行
            List<Integer> prevRow = triangle.get(rowNum-1);	//方便后面复用

            // The first row element is always 1.
            row.add(1);

            // Each triangle element (other than the first and last of each row)
            // is equal to the sum of the elements above-and-to-the-left and
            // above-and-to-the-right.
            for (int j = 1; j < rowNum; j++) {
                row.add(prevRow.get(j-1) + prevRow.get(j));	//复用计算
            }

            // The last row element is always 1.
            row.add(1);

            triangle.add(row);		//在list中一行行嵌入list
        }

        return triangle;
    }
}

第一次写的很多冗余代码(没法看了,119答的还勉强能看),注意假如for循环从第二行开始,第二层for循环在此时是不执行的。。。。

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list=new ArrayList<List<Integer>>();
        if(numRows==0) return list;
        if(numRows==1){
            List <Integer> list1=new ArrayList <Integer>();
            list1.add(1);
            list.add(list1);
        }else if(numRows==2){
            List <Integer> list1=new ArrayList <Integer>();
            list1.add(1);
            List <Integer> list2=new ArrayList <Integer>();
            list2.add(1);list2.add(1);
            list.add(list1);list.add(list2);
        }else{
            List <Integer> list31=new ArrayList <Integer>();
            list31.add(1);
            List <Integer> list32=new ArrayList <Integer>();
            list32.add(1);list32.add(1);
            list.add(list31);list.add(list32);

            for(int i=2;i<numRows;i++){
                List<Integer> list_temp=new ArrayList<Integer>();
                list_temp.add(1); 
                for(int j=1;j<i;j++){
                    int temp=list.get(i-1).get(j-1)+list.get(i-1).get(j);
                    list_temp.add(temp);
                }
                list_temp.add(1);

                list.add(list_temp);
            }
                
        }
        return list;
    }
}

虽然很简单,但是记录好像能凑齐龙珠召唤神龙啊啊啊啊啊

119.杨辉三角 ||
注意是索引。通过一个中间list保存新的计算结果来实现复用。

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List <Integer> list=new ArrayList <Integer>();  //最终需要返回
        if (rowIndex == 0) {		//特殊情况
            list.add(1)}
        List <Integer> list_on=new ArrayList <Integer>();//for循环外定义,循环里定义不方便保留新计算的一行
        for (int lineNum = 1; lineNum <= rowIndex; lineNum++) {
           
            list.add(1);
            for(int rowNum =1; rowNum <lineNum; rowNum++){
                list.add(list_on.get(rowNum-1)+list_on.get(rowNum));	//计算新的一行
            }
            list.add(1);

            if(lineNum!=rowIndex){	//注意加判断,如果遍历到目标行就不clear了
                list_on.clear();
                list_on.addAll(list);	//保留新计算的行,在下一次循环中复用计算
                list.clear();  
            }         
        }
            
    return list;//返回函数内一定要有直接的return,方法内的代码段可有其他return来提前返回。
    }
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值