【LeetCode刷题记录】Pascal's Triangle

来源:互联网 发布:有百合网源码卖 编辑:程序博客网 时间:2024/05/21 06:32

题目:

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

0 0
原创粉丝点击