118 Pascal's Triangle

题目详情

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]

理解

  • 首先我们要先理解一下pascal三角形(杨辉三角),每行端点与结尾的数为1,每个数等于它上方两数之和。
  • 解法的实现还是比较简单的。首先要对特殊情况进行处理(numRows小于等于0的情况)。然后循环,每一次产生一个List,i个list有i个元素,每个list的第一个和第i个元素都是1.
  • 对于list中间的那些元素,则找出前一个list的对应位置的两个元素加和即可得到。

解法

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

119 Pascal's Triangle2

题目详情

Given an index k, return the kth row of the Pascal's triangle.
For example, given k = 3,
Return [1,3,3,1].
Note:
Could you optimize your algorithm to use only O(k) extra space?

理解

  • 这道题和118一样,都是基于帕斯卡三角形的。这一道题只要求返回List形式的、一行的元素即可。
  • 这道题有个额外的要求就是只消耗O(k)的额外空间
  • 于是我们只在方法最开始声明一个list,以后每一行的结果都保存在这个list中,同时根据list中元素的值计算出的下一行的元素覆盖掉计算过的元素。

解法

    public List<Integer> getRow(int rowIndex) {
        List<Integer> list = new ArrayList<Integer>();
        
        if(rowIndex < 0 ){
            return list;
        }
        
        for(int i=0;i < rowIndex+1;i++){
            list.add(0,1);
            
            for(int j=1;j<list.size()-1;j++){
                list.set(j, list.get(j)+list.get(j+1));
            }
        }
        return list;
    }

soleil阿璐
350 声望45 粉丝

stay real ~