给定非负整数numRows,生成Pascal三角形的第一个numRows。
在Pascal的三角形中,每个数字都是它上面两个数字的总和。
示例:
Input: 5
Output:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
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/
答案 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]]