leetcode-Pascal's Triangle(I、II)

Problems:
(1)Given numRows, generate the first numRows of Pascal’s triangle.

For example, given numRows = 5

Return:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]

(2)Given an index k, return the kth row of the Pascal’s triangle.
For example, given k = 3,
Return [1,3,3,1].

Solution:
(1)其实这个问题并不难,listAll中包含listOne,在求该个listOne的时候需要调用前一个listOne.

public class Solution {
    public List<List<Integer>> generate(int numRows) {

        List<List<Integer>> listAll = new ArrayList<List<Integer>>();
        if(numRows == 0) return listAll;
        List<Integer> listOne = new ArrayList<Integer>();
        listOne.add(1);
        listAll.add(one);

        for(int i = 1 ; i < numRows ; i++){
            List<Integer> newlist = new ArrayList<Integer>();
            newlist.add(1);
            for(int j = 1 ; j < i ; j++){
                  newlist.add(j,listAll.get(i-1).get(j-1)+listAll.get(i-1).get(j));
            }
            newlist.add(1);
            listAll.add(i,newlist);

        }

        return listAll;
    }
}
***但是我犯了一个非常难以找出来的错误,发出来与大家共享。我初始化了一个公用listOne,在for循环中,每次都清空listOne,也就是listOne.clear(),然后再放下一组数据。
 注意,这样做会影响所有跟listOne有关的变量。比如listAll中存储的listOne也会被清空。所以不要轻易用clear()命令。***

 后来改成在for循环中,每次新定义一个newlist,这样的话就不会对前一个newlist造成影响,更不会影响listAll这个list了。

(2) 其实第一个问题做出来了,这个问题的思路和第一个一样。
不同的是,这里需要单独用一个list保存上一个数据。

public class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> one = new ArrayList<Integer>();

        one.add(1);
        //第0行
        if(rowIndex == 0) return one;

        //从第1行开始
        for(int i = 1 ; i <= rowIndex ; i++){
            List<Integer> newlist = new ArrayList<Integer>();
            newlist.add(1);
            for(int j = 1 ; j < i ; j++){
                  newlist.add(j,one.get(j-1)+one.get(j));
            }
            newlist.add(1);
            one = newlist;
        }

        return one;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值