119.杨辉三角II

题目:[https://leetcode-cn.com/problems/pascals-triangle-ii/description/]
思路:题目要求只输出第k行的数列,有两个思路:
一、杨辉三角形本质为二次项系数展开式的在三角形的一种几何排列,第n层第i项(i从0开始)等于\(C^i_n=\frac{n!}{i!(n-i)!}\),依此计算元素值即可,在本题中,k的最大值可以到33,直接计算组合数存在数据溢出到问题
二、与118[https://www.cnblogs.com/kipper/p/9644162.html]总体思路一样,考虑到空间复杂度到限制,逐行计算,直到计算到目标行即可。

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        vector<int> ans(rowIndex+1);//声明rowIndex+1个容器,每个都是空,因为第rowIndex行有rowindex+1个元素
        for (int line=0; line<=rowIndex; ++line) {//line表示第几行数据,当line等于rowIndex的时候即表示第rowIndex行的数据
            for (int i=line;i>=0; --i) {//从第line个元素开始,到第0个元素,除首尾以外。每一个元素都
                if (i==line) {//末尾置1,
                    ans[i]=1;
                    continue;
                }
                if (i==0) {//首位置1
                    ans[i]=1;
                }
                else ans[i]=ans[i]+ans[i-1];
            }
        }
        return ans;
    }
};

讨论区[https://leetcode.com/problems/pascals-triangle-ii/discuss/38420/Here-is-my-brief-O(k)-solution]
讨论区示范性代码

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        
        vector<int> ret(rowIndex+1,1);//差距:默认置1,减少单独进行都操作,优化时间
        for(int i=0;i<rowIndex+1;++i){
            for(int j=i-1;j>=1;--j)
                ret[j]=ret[j]+ret[j-1];
        }
        return ret;
    }
};

反思:一、vector容器的初始化中值都含义:对于园括号()我们通常考虑其提供都值是用来构造vector都;对于花括号{}则一般会尽可能都当作元素初始值都列表来处理。只有无法执行列表都时候,才考虑其他初始化方式
二、算法思路要考虑数据运算范围,避免在运算过程中出现数据丢失
三、循环体边界都确定要准确
四、算法目的清晰进行优化

posted @ 2018-09-15 00:10  Kipper  阅读(173)  评论(0)    收藏  举报