LeetCode 118. Pascal‘s Triangle

Given an integer numRows, return the first numRows of Pascal's triangle.

In Pascal's triangle, each number is the sum of the two numbers directly above it as shown:

Example 1:

Input: numRows = 5
Output: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

Example 2:

Input: numRows = 1
Output: [[1]]

Constraints:

  • 1 <= numRows <= 30

就,很普通的帕斯卡三角,就按照规律写就行了,主要就是注意边界条件吧。自己写了个不太简洁的,但是是按照我自己的思维逻辑写的,逻辑很直观。

Runtime: 1 ms, faster than 81.76% of Java online submissions for Pascal's Triangle.

Memory Usage: 41.9 MB, less than 38.22% of Java online submissions for Pascal's Triangle.

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> first = new ArrayList<>();
        first.add(1);
        result.add(first);
        
        for (int i = 1; i < numRows; i++) {
            List<Integer> row = new ArrayList<>();
            row.add(1);
            List<Integer> prev = result.get(i - 1);
            for (int j = 0; j < i - 1; j++) {
                row.add(prev.get(j) + prev.get(j + 1));
            }
            row.add(1);
            result.add(row);
        }
        
        return result;
    }
}

然后看了一下discussion的解法,嗯,果然还是有优雅的写法的。首先我上面的解法可以不把单独为1的情况拎出来,两个row.add(1)可以写成一个if (j == 0 || j == i),所以i其实也不用把第一行拎出来了。

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> result = new ArrayList<>();
        
        for (int i = 0; i < numRows; i++) {
            List<Integer> row = new ArrayList<>();
            for (int j = 0; j < i + 1; j++) {
                if (j == 0 || j == i) {
                    row.add(1);
                } else {
                    List<Integer> prev = result.get(i - 1);
                    row.add(prev.get(j - 1) + prev.get(j));
                }
            }
            result.add(row);
        }
        
        return result;
    }
}

还有一种解法是复用List<Integer> row,相当于变相保存前一行的结果,动态更新为新的一行,还挺巧妙的但是不那么直观。每次都往row的最前面加一个1,加完以后这个row就是这行的总数了,然后从第二个数字开始,这个数字的新值就应该是这个数字和这个数字后一个之和。最后往外层list加的时候记得new ArrayList<>()因为相当于是传的reference。

Runtime: 1 ms, faster than 81.76% of Java online submissions for Pascal's Triangle.

Memory Usage: 41.6 MB, less than 65.97% of Java online submissions for Pascal's Triangle.

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> row = new ArrayList<>();
        
        for (int i = 0; i < numRows; i++) {
            row.add(0, 1);  // add to the first index
            for (int j = 1; j < row.size() - 1; j++) {  // start from the second one, need to add for row.size() - 2 times
                row.set(j, row.get(j) + row.get(j + 1));  // row[j] (new) = row[j] + row[j + 1]
            }
            result.add(new ArrayList<>(row));
        }
        
        return result;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值