Java&LeetCode 初入门——118. 杨辉三角

Java&LeetCode 初入门——118. 杨辉三角

文内代码全部采用JAVA语言。

题目

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。

测试用例

输入: 5
输出:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

个人解法

杨辉三角大家都很熟悉了。这题的输入是三角的行数,输出是双层List,内层的list是每一行的数字集合,外层是内层list的集合。这个还是很好理解的。

思路是遍历。首先对行数numRows循环,再对每一行的元素循环。ArrayList提供了迭代器可以使用。对于特殊的numRows=0和的情况,都不能通过循环生成,所以直接if,返回答案。对于新的一行的产生,需要遍历上层行的元素,因此新建两个ArrayList,row1和row2。具体解释参见代码中注释。

执行用时: 1 ms, 在Pascal’s Triangle的Java提交中击败了95.00% 的用户

class Solution {
    public List<List<Integer>> generate(int numRows) {
		List<Integer> row1=new ArrayList<Integer>();//上层行
		List<List<Integer>> ans=new ArrayList<List<Integer>>();//输出答案
		if (numRows==0) {
			return ans;//输入0,返回[]
		}
		row1.add(1);//第一行的初始值[1]
		ans.add(row1);//将第一行放入答案
		if (numRows==1) {
			return ans;//输入1,返回[[1]]
		}
		for (int i = 2; i <=numRows; i++) {
		//从行数大于等于2时,可以开始遍历求解。循环体用不到i,只是用于计数
			Iterator<Integer> it=row1.iterator();
			//生成迭代器,对上层的元素进行遍历。比如i=3时,迭代循环第二行
			int a=0;//a用于存放前一个加数。
			List<Integer> row2=new ArrayList<Integer>();//新建row2,存放和值
			while (it.hasNext()) {
				int b=it.next();//b是每行第一个数到最后一个数
				row2.add(a+b);//在row2中添加和值
				a=b;//向后移动
			}
			row2.add(1);//每行最后一个值,全都是1
			row1=row2;//准备求row2下一行,这时需要遍历row2
			ans.add(row2);//将row2添加到ans
		}
		return ans;

	}
}

官方解法

思路

如果能够知道一行杨辉三角,我们就可以根据每对相邻的值轻松地计算出它的下一行。

算法

与个人解法基本一致,只是这里用的是ArrayList.get,使代码看起来较为简洁。同样是嵌套两层循环,运行时间也差不多,都是1ms。

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> triangle = new ArrayList<List<Integer>>();

        // 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);

        for (int rowNum = 1; rowNum < numRows; rowNum++) {
            List<Integer> row = new ArrayList<>();
            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);
        }

        return triangle;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_27480345/article/details/86475563