Leetcode刷题笔记——数据结构(数组相关:杨辉三角)

杨辉三角

原题:
在这里插入图片描述
思路: 动态规划。这个需要注意的时杨辉三角时从0开始的。然后再控制循环变量的时候,变量的边界值,取值需要思考。用代码来解释:
第一次错误示范:

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> dp=new ArrayList<>();
        if(numRows==0)
            return dp;
        dp.add(new ArrayList<>());
        dp.get(0).add(1);//第一行只有一个1,所以直接添加
        for(int i=1;i<numRows;i++){//此处i从1开始,代表杨辉三角的第二行
            List<Integer> row =new ArrayList<>();
            List<Integer> prerow=dp.get(i-1);//定义杨辉三角的上一行
            row.add(1);
            for(int j=1;j<i-1;j++){
                row.add(prerow.get(j)+prerow.get(j-1));
            }
            row.add(1);
            dp.add(row);
        }
        return dp;
        
        

    }
}

但是,i从1开始,代码运行结果第二行跟第三行都是[1,1],出现了问题。
在这里插入图片描述
分析:因为,当i=1和i=2时,中间的for循环都不执行,然后这两行只增加首和尾的1。所以,变量i要从2开始取值。并且要注意,定义上一行时,dp选取的行要是i-2。i不再代表杨辉三角第几行的含义,只是用它来控制循环。因为杨辉三角时从第零行开始的。

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> dp=new ArrayList<>();
        if(numRows==0)
            return dp;
        dp.add(new ArrayList<>());
        dp.get(0).add(1);
        for(int i=2;i<=numRows;i++){
            List<Integer> row =new ArrayList<>();
            List<Integer> prerow=dp.get(i-2);//此处注意,如果写i-1会报错
            row.add(1);
            for(int j=1;j<i-1;j++){
                row.add(prerow.get(j)+prerow.get(j-1));
            }
            row.add(1);
            dp.add(row);
        }
        return dp;
        
        

    }
}

第二种解法:找规律
实际会发现,杨辉三角的当前行的是:上一行a与a向后移一位后,两者相加得到的。空位记得补零
在这里插入图片描述
上代码:

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> dp=new ArrayList<>();
        if(numRows==0)
            return dp;
        List<Integer> first=new ArrayList<>();
        first.add(1);
        dp.add(new ArrayList(first));
        int size=dp.size();
        while(size<numRows){
            LinkedList<Integer> former=new LinkedList<>();
            LinkedList<Integer> latter=new LinkedList<>();
            former.addFirst(0);//空位补零
            latter.addLast(0);
            for(int i:dp.get(size-1)){
                former.addFirst(i);
                latter.addLast(i);
            }
            List<Integer> newrow=new ArrayList<>();
            for(int j=0;j<=size;j++){//注意j的取值范围,因为补零之后,长度增加1
                newrow.add(former.get(j)+latter.get(j));
            }
            dp.add(newrow);
            size++;
        }
        return dp;
    }
       
}

PS:这里学习到了一种新的数据结构,双端链表,LinkedList
主要用到的函数是,头插和尾插。addFirst()和addLast()

杨辉三角Ⅱ

原题
在这里插入图片描述
思路: 跟上一题不同的是,这里要求返回的是杨辉三角的第k行。不需要再判断k是否为0,0也是正常的行数。并且再循环行数的时候,要比上一题多循环一次。因为这次需要的是杨辉三角的第k行。
上代码:

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<List<Integer>> dp=new ArrayList<>();
        List<Integer> first =new ArrayList<>();
        first.add(1);
        dp.add(first);
        for(int i=2;i<=rowIndex+1;i++){ //这里需要注意,比上一题多循环一遍
            List<Integer> row=new ArrayList<>();
            List<Integer> prerow= dp.get(i-2);
            row.add(1);
            for(int j=1;j<i-1;j++){
                row.add(prerow.get(j)+prerow.get(j-1));
            }
            row.add(1);
            dp.add(row);
        }
        return dp.get(rowIndex);

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值