码迷,mamicode.com
首页 > 其他好文 > 详细

Pascal's Triangle II

时间:2014-10-27 17:33:44      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   os   ar   for   sp   

Given an index k, return the kth row of the Pascal‘s triangle.

For example, given k = 3,
Return [1,3,3,1].

Note:
Could you optimize your algorithm to use only O(k) extra space?

首先我们来熟悉下杨辉三角形的特点:

1、每个数等于它上方两数之和。
2、每行数字左右对称,由1开始逐渐变大。
3、第n行的数字有n项。
4、第n行数字和为2n-1
5、第n行的第m个数和第n-m+1个数相等,即C(n-1,m-1)=C(n-1,n-m)(组合数性质之一)
6、每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。即
bubuko.com,布布扣
7. 
bubuko.com,布布扣

bubuko.com,布布扣

 

1.空间复杂度为O(k2)比较容易想到,代码如下,注意vector二维数组的初始化,必须定义二维数组的行数:

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        vector<vector<int>> vec(rowIndex+1);
        for(int i=0;i<=rowIndex;++i)
        {
            vec[i].push_back(1);
            for(int j=1;j<=i-1;++j)
            {
                vec[i].push_back(vec[i-1][j-1]+vec[i-1][j]);
            }
            if(i!=0)
                vec[i].push_back(1);
        }
        return vec[rowIndex];
    }
};

2.空间复杂度O(k),我们可以只用一个数组来表示杨辉三角形,当我们在某一行从前往后看的时候,发现最后一个加上倒数第二个等于下一行的最后一个,且不会更新我们需要的那个数,进而可以算出下一行的倒数第二个。

代码如下:

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        vector<int> vec(rowIndex+1,0);
        int i,j;
        for (i=0; i<=rowIndex; ++i) {
            if(i==0)
                vec[0]=1;
            else
            {
                for (j=i-1; j>=1; --j) 
          { vec[j]
=vec[j]+vec[j-1]; } vec[i]=1; } } return vec; } };

 

Pascal's Triangle II

标签:style   blog   http   io   color   os   ar   for   sp   

原文地址:http://www.cnblogs.com/fightformylife/p/4054545.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!