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都;对于花括号{}则一般会尽可能都当作元素初始值都列表来处理。只有无法执行列表都时候,才考虑其他初始化方式
二、算法思路要考虑数据运算范围,避免在运算过程中出现数据丢失
三、循环体边界都确定要准确
四、算法目的清晰进行优化

浙公网安备 33010602011771号