我使用级别顺序遍历的概念来生成Pascal Triangle。
以下是代码段:
void printPascalTriangle(int n)
{
int line=1,Q[50]={0},f=-1,r=-1,prev,t;
Enqueue(Q,&f,&r,1);
Enqueue(Q,&f,&r,0);
prev=0;
while(line!=n)
{
t = Dequeue(Q,&f,&r);
if( !t )
{
line++;
prev = 0;
Enqueue(Q,&f,&r,1);
if(!isEmpty(&r))
Enqueue(Q,&f,&r,0);
printf("\n");
}
else
{
printf("%d ", t);
Enqueue(Q,&f,&r,prev+t);
prev = t;
}
}
}
完整代码为here:
这种方法的优点是它的空间复杂度是O(N),其中N是行数。
还有更好的方法吗?
答案 0 :(得分:2)
由于你唯一关心的是空间复杂性,并且你正在使用int
(而不是某种大整数类型的潜在无限大小),你实际上可以实现O(1)的空间复杂度通过使用这两个事实:
这两个事实意味着您可以仅使用同一行的前一个元素计算每个元素,因此您不必一次保存多个元素。
(通过 C ( n , k )我的意思是行 n 中的元素,位置 k Pascal的三角形,假设行和位置从0开始编号。)
答案 1 :(得分:0)
我认为您想要的是代码,而不是方程式?这是两种JavaScript实现,一种带有阶乘计算,另一种不带阶乘计算。我不确定要选择哪一个:
//1. non-factorial option
function GenerateTriangle1(rows) {
var pascalsTriangle = [];
for (var r = 0; r < rows; r++) {
var elements = r + 1;
var level = [];
for (var i = 0; i < elements; i++) {
if (i === 0 || i === elements - 1 || r === 1)
level[i] = 1;
else {
var prevRow = pascalsTriangle[r - 1];
level[i] = prevRow[i - 1] + prevRow[i];
}
}
pascalsTriangle[r] = level;
}
return pascalsTriangle;
}
//2. Factorial option
function GenerateTriangle2(rows) {
var pascalsTriangle = [];
for (var r = 0; r < rows; r++) {
var elements = r + 1;
var level = [];
for (var i = 0; i < elements; i++) {
level[i] = CalculateTerm(r, i);
}
pascalsTriangle[r] = level;
}
return pascalsTriangle;
}
function CalculateTerm(row, term) {
var divisor = Factorial(term) * Factorial(row - term);
return divisor > 0 ? Factorial(row) / divisor : 1;
}
function Factorial(n) {
return n > 1 ? n * Factorial(n - 1) : n;
}
console.log(GenerateTriangle1(4))
console.log(GenerateTriangle1(5))