zoukankan      html  css  js  c++  java
  • Pascal's Triangle II

    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个数之和,这也是组合数的性质之一。即
    7. 

    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

    For example, given numRows = 5,
    Return

    [
         [1],
        [1,1],
       [1,2,1],
      [1,3,3,1],
     [1,4,6,4,1]
    ]
    代码如下:
    class Solution {
    public:
        vector<vector<int> > generate(int numRows) {
            vector<vector<int>> vec(numRows);
            for(int i=0;i<numRows;++i){
                vec[i].push_back(1);
                for(int j=1;j<=i-1;++j){
                    vec[i].push_back(vec[i-1][j]+vec[i-1][j-1]);
                }
                if(i!=0)
                    vec[i].push_back(1);
            }
            return vec;
        }
    };
  • 相关阅读:
    git merge 和 git rebase 的使用场景
    Xcode 报错:解决 Could not attach to pid : "xx" 不重开工程的杀手锏
    软件设计模式的7条原则
    iOS开发信号量的使用
    利用SAMKeyChain生成唯一设备号
    iOS Fundation和CoreFoundation的对象转换内存管理权问题
    已有的PHP安装gd扩展
    centos7 编译安装 php7.4
    Nacos集群模式部署步骤
    搭建 Apache RocketMQ 单机环境
  • 原文地址:https://www.cnblogs.com/fightformylife/p/4054545.html
Copyright © 2011-2022 走看看