题目:
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]
]
解答:
帕斯卡三角,又名“杨辉三角”,基本规律是每一行的第一个和最后一个元素都是1,其它元素(第i个,1<i<n)等于上一行的两个元素(第i个和第(i+1)个)之和。公式很简单,关键是用什么数据结构去实现。
题目给出的返回值是vector<vector<int> >
,一直对C++的vector不太熟(惭愧惭愧,代码写太少)。这里给自己梳理一下vector的概念和用法:
vector可以看成是array,最明显的不同是vector支持动态调整容量,而array一般在声明时要求指定长度且不可变。因此,vector可视为自动扩展容量的数组。和数组一样,支持通过下标访问元素(常数时间O(1)),在集合尾端增加或删除元素也是花费常数时间O(1),若在vector集合中间增加或删除元素时间复杂度是线性时间O(n),较为费时。
在使用时,需要在头部引入”#include <vector>
“,它属于std命名空间。
常用方法包括:
- 访问元素
- vec[i]或vec.at(i)- 访问第i个元素,注意后者会进行边界检查
- vec.front()和vec.back() - 访问第一个和最后一个元素
- 新增或移除元素
- vec.push_back()和vec.pop_back - 新增和移除尾端元素
- vec.insert()、vec.erase()和vec.clear - 插入、删除指定元素,或清除所有元素
获取长度与容量
- vec.size() - 获取vector目前持有元素个数
- vec.capacity() - 返回vector可容纳的最大元素
- vec.resize() - 改变 vector 目前持有的元素个数。
迭代
- vec.begin() - 回传一个Iterator,它指向 vector 第一个元素。
- vec.end() - 回传一个Iterator,它指向 vector 最尾端元素的下一个位置(请注意:它不是最末元素)。
- vec.rbegin() - 回传一个反向Iterator,它指向 vector 最尾端元素的。
- vec.rend() - 回传一个Iterator,它指向 vector 的第一个元素。
啰嗦了这么多,直接上AC代码:
vector<vector<int> > generate(int numRows) {
vector<vector<int> > result;
result.resize(numRows);
for (int i=0; i<numRows; i++) {
result[i].resize(i+1);// dynamically resize vector's size
// initialize each row's begin and end to 1
result[i][0] = 1;
result[i][result[i].size()-1] = 1;
for (int j=1; j<result[i].size()-1; j++) {
result[i][j] = result[i-1][j-1] + result[i-1][j];
}
}
return result;
}
参考链接:
1. 维基百科Vector (STL):http://zh.wikipedia.org/zh-cn/Vector_(STL)
2. 顺序容器:vector的自增长特性:http://www.xuebuyuan.com/2116818.html