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;
        }
    };
  • 相关阅读:
    PAT 甲级 1027 Colors in Mars
    PAT 甲级 1026 Table Tennis(模拟)
    PAT 甲级 1025 PAT Ranking
    PAT 甲级 1024 Palindromic Number
    PAT 甲级 1023 Have Fun with Numbers
    PAT 甲级 1021 Deepest Root (并查集,树的遍历)
    Java实现 蓝桥杯VIP 算法训练 无权最长链
    Java实现 蓝桥杯VIP 算法训练 无权最长链
    Java实现 蓝桥杯 算法提高 抽卡游戏
    Java实现 蓝桥杯 算法提高 抽卡游戏
  • 原文地址:https://www.cnblogs.com/fightformylife/p/4054545.html
Copyright © 2011-2022 走看看