求教一个有关Pascal's triangle的一个简单问题,谢谢。。。

csdn19891 2014-07-08 01:39:35
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]
]
对于res[i-2],当i-2<0时,为什么不会报错?
row[j] = res[i-2][j-1] + res[i-2][j]; 是怎么得出的?是归纳的么?是用已知的某一位置的结果,推断列的值?不理解这句话。。。
row[i-1] = 1;表示i-1行都为1,肯定不是啊,没太明白程序的意思。。。
但这个程序通过了。。。
谢谢。

class Solution {  
public:
vector<vector<int> > generate(int numRows) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int> > res;
for(int i = 1; i<= numRows;++i){
vector<int> row(i);
row[0] = 1; //
row[i-1] = 1; //
for(int j = 1; j< i-1; ++j){
row[j] = res[i-2][j-1] + res[i-2][j]; //
}
res.push_back(row);
}
return res;
}
};
...全文
109 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdn19891 2014-07-08
  • 打赏
  • 举报
回复
引用 5 楼 brookmill 的回复:
vector<int> row(i+1); // 这里要改成 i+1 既然用0替换了1,那就把所有的i都改成i+1,所有的i-1改成i,以此类推
非常感谢 每次都是您帮助的最详细~ 追加到100分都加上了 谢谢~~~
brookmill 2014-07-08
  • 打赏
  • 举报
回复
vector<int> row(i+1); // 这里要改成 i+1 既然用0替换了1,那就把所有的i都改成i+1,所有的i-1改成i,以此类推
csdn19891 2014-07-08
  • 打赏
  • 举报
回复
引用 3 楼 brookmill 的回复:
[quote=引用 楼主 csdn19891 的回复:] row[j] = res[i-2][j-1] + res[i-2][j]; 是怎么得出的?是归纳的么?是用已知的某一位置的结果,推断列的值?不理解这句话。。。
这就是这个三角的定义呀,每个数等于上面两个数之和。 以i=5为例: row[0] = 1; // row[0],也就是最左边一个数是1 row[i-1] = 1; // row[4],也就是最右边一个数是1 for(int j = 1; j< i-1; ++j){ row[j] = res[i-2][j-1] + res[i-2][j]; // // row[1] = res[3][0] + res[3][1],也就是 4 = 1 + 3,第4行的第1个数和第2个数相加 // row[2] = res[3][1] + res[3][2],也就是 6 = 3 + 3,第4行的第2个数和第3个数相加 // row[3] = res[3][2] + res[3][3],也就是 4 = 3 + 1,第4行的第3个数和第4个数相加 } 这里不太好理解的可能是行的计数是从0开始,也就是说,从第一行到第五行分别是res[0]到res[4],把这个弄明白了,其它的就不难理解了。 想看懂程序其实也不难,就把自己想象成CPU,依次一条一条的执行就行了。在纸上画个图,把i和j的值都代进去,一步步看看执行的过程。 [/quote]啊 非常感谢 这个题完全想明白了~~ 确实从0开始计数感觉有点乱,然后按照我想的修改了一下,运行了下显示Runtime Error,原来的是正确的, 麻烦您看是不是我哪里改错了?改动的地方都注释了,谢谢~
class Solution { 
public: 
vector<vector<int> > generate(int numRows) { 
vector<vector<int> > res; 
for(int i = 0; i< numRows;++i){ //   i 从0开始,把<=改为<
vector<int> row(i); 
row[0] = 1; //最左边一个数是1
row[i] = 1; //最右边一个数是1
for(int j = 1; j< i; ++j){ //把 j< i-1 改为  j< i
row[j] = res[i-1][j-1] + res[i-1][j]; // row[1] = res[2-1][1-1] + res[2-1][1]=1+1=2,第2行的第1个数和第2个数相加
} 
res.push_back(row); 
} 
return res; 
} 
};
brookmill 2014-07-08
  • 打赏
  • 举报
回复
引用 楼主 csdn19891 的回复:
row[j] = res[i-2][j-1] + res[i-2][j]; 是怎么得出的?是归纳的么?是用已知的某一位置的结果,推断列的值?不理解这句话。。。
这就是这个三角的定义呀,每个数等于上面两个数之和。 以i=5为例: row[0] = 1; // row[0],也就是最左边一个数是1 row[i-1] = 1; // row[4],也就是最右边一个数是1 for(int j = 1; j< i-1; ++j){ row[j] = res[i-2][j-1] + res[i-2][j]; // // row[1] = res[3][0] + res[3][1],也就是 4 = 1 + 3,第4行的第1个数和第2个数相加 // row[2] = res[3][1] + res[3][2],也就是 6 = 3 + 3,第4行的第2个数和第3个数相加 // row[3] = res[3][2] + res[3][3],也就是 4 = 3 + 1,第4行的第3个数和第4个数相加 } 这里不太好理解的可能是行的计数是从0开始,也就是说,从第一行到第五行分别是res[0]到res[4],把这个弄明白了,其它的就不难理解了。 想看懂程序其实也不难,就把自己想象成CPU,依次一条一条的执行就行了。在纸上画个图,把i和j的值都代进去,一步步看看执行的过程。
brookmill 2014-07-08
  • 打赏
  • 举报
回复
引用 楼主 csdn19891 的回复:
对于res[i-2],当i-2<0时,为什么不会报错?
这是因为不会出现i-2<0的情况。 for(int j = 1; j< i-1; ++j){ // i-2<0的情况下,这个循环就不会执行,因为给j赋初值1之后,j<i-1一开始就不成立 row[j] = res[i-2][j-1] + res[i-2][j]; //
brookmill 2014-07-08
  • 打赏
  • 举报
回复
引用 楼主 csdn19891 的回复:
row[i-1] = 1;表示i-1行都为1,肯定不是啊,没太明白程序的意思。。。
row是一个数组,代表某一行,row[i]代表这一行的第i个值 row[0] = 1; // 本行第一个(最左边)数是1 row[i-1] = 1; // 本行最后一个(最右边)数是1 顺便说一句,这个在中国叫杨辉三角

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧