帕斯卡三角形 - 不希望的输出

时间:2018-06-10 21:42:27

标签: java

给定非负整数numRows,生成Pascal三角形的第一个numRows。

在Pascal的三角形中,每个数字都是它上面两个数字的总和。

示例:

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

Image

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

        List<List<Integer>> res = new ArrayList<>();
        List<Integer> prev = new ArrayList<>();
        List<Integer> curr = new ArrayList<>();

        if(numRows<=0)
            return res;

        prev.add(1);
        res.add(prev);
        if(numRows==1)
        return res;

          prev.add(1);
          res.add(prev); 
        if( numRows==2)
         return res;


            int k=3;

            while(k<=numRows)
            {

                Integer[] arr = prev.toArray(new Integer[prev.size()]);
                curr.clear();
                curr.add(1);
                for(int i=0;i<arr.length-1;i++)
                {
                    curr.add(arr[i]+arr[i+1]);

                }
                curr.add(1);
                for(int i : curr)
                System.out.print(i+" ");
                System.out.print("\n");
                res.add(curr);
                prev=curr;
                k++;
            }


        return res;
    }
}

对于n = 3,我得到正确的输出。 但是对于n = 4

Your stdout
1 2 1 
1 3 3 1 
Your answer
[[1,1],[1,1],[1,3,3,1],[1,3,3,1]]
Expected answer
[[1],[1,1],[1,2,1],[1,3,3,1]]

对于n = 5

1 2 1 
1 3 3 1 
1 4 6 4 1 
Your answer
[[1,1],[1,1],[1,4,6,4,1],[1,4,6,4,1],[1,4,6,4,1]]
Expected answer
[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

如果您看到 - STD OUT具有正确的值 - 但最终结果在Leetcode上有所不同 https://leetcode.com/problems/pascals-triangle/description/

1 个答案:

答案 0 :(得分:2)

正在发生的事情是,在这些行中,您要向res添加一个列表,例如:

prev.add(1);
res.add(prev);

您正在向prev添加res的引用,因此如果prev发生更改,则更改将反映在res中。例如:

    prev.add(1);    // prev = [1]
    res.add(prev);  // res = [[1]] // all good so far
    if(numRows==1)
        return res;

    prev.add(1);    // prev = [1, 1]            
    res.add(prev);  //  res = [[1, 1], [1, 1]]  or [prev, prev] // here's the problem
    if( numRows==2)
        return res;

只需使用new ArrayList<>(listToCopy);

创建要尝试插入的列表的浅表副本
public List<List<Integer>> generate(int numRows) {

    List<List<Integer>> res = new ArrayList<>();
    List<Integer> prev = new ArrayList<>();
    List<Integer> curr = new ArrayList<>();

    if (numRows <= 0)
        return res;

    prev.add(1);
    res.add(new ArrayList<>(prev));
    if (numRows == 1)
        return res;

    prev.add(1);
    res.add(new ArrayList<>(prev));
    if (numRows == 2)
        return res;

    int k = 3;

    while (k <= numRows) {

        Integer[] arr = prev.toArray(new Integer[prev.size()]);
        curr.clear();
        curr.add(1);
        for (int i = 0; i < arr.length - 1; i++) {
            curr.add(arr[i] + arr[i + 1]);

        }
        curr.add(1);
        for (int i : curr)
            System.out.print(i + " ");
        System.out.print("\n");
        res.add(new ArrayList<>(curr));
        prev = curr;
        k++;
    }

    return res;
}

表示n = 5,res

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