【LeetCode刷题记录】Pascal's Triangle

题目:

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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值