【leetcode】Pascal's Triangle[java]

leetcode题,

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]
]

这道题就是打印杨辉三角,作者写了一些方法,还是觉得在java里面下面这种方法要快速有效一些。首先

参考了这篇博文[LeetCode] Pascal's Triangle (java),该作者使用了一个子方法来产生一个第n层的杨辉数,有一

点值得肯定,就是必须要创建新的List<Integer>,有兴趣的读者可以使用Pascal's Triangle II这里面的方法,但是

发现最后会导致什么问题呢?你所有的List<List<Integer>>里的List<Integer>值都为最后的哪一个,一开始我也很

郁闷,后来网上查了一些资料,原来是每次传进List<List<Integer>>的List<Integer>都是其在内存里的一个引用,

而对象是同一个所以每次取都只会取到最新的值。所以需要对每个LIst<Integer>创建不同的对象。

上面那篇博文采用每次都创建一个从第一层开始的对象,这样要输出n层的整个图形必须要调用(n*(n-1))/2次,

不管对存储和运算都是极大的浪费。本文采用叠加的方式,子方法描述为后一层从前一层得到,而不是从第一层开

始。大大缩减了计算量。具体代码如下:

public class Solution {
    public List<List<Integer>> generate(int numRows) {
         <span style="white-space:pre">	</span>//打印前n行的list
		//由上一个list产生下一个list
		List<List<Integer>> listlist = new ArrayList<List<Integer>>();
		List<Integer> list = new ArrayList<Integer>();
		if(numRows == 0) return listlist;
		list.add(1);
		listlist.add(list);
		if(numRows == 1) return listlist;
		
		for(int i=1;i<numRows;i++)
		{
			list = genList(list);
			listlist.add(list);
		}
		
		
		return listlist;
    }
    public static List<Integer> genList(List<Integer> listinput)//子方法
	{
		List<Integer> list = new ArrayList<Integer>();
		int len = listinput.size();
		list.add(1);
		for(int j=1;j<=len-1;j++)
		{
			list.add(listinput.get(j-1)+listinput.get(j));
		}
		list.add(1);
		return list;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值