目录
题目描述:
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
解题思路:
贪心算法,保证每次局部操作是最优解,从而是最终得到的结果是全局最优解。
具体步骤,结果看成是二维数组,两层循环,外层行赋值,内层列赋值:
(1)行数i索引是0开始,每一行的开头和结束都是1;
(2)从第三行,即i=2开始,当前行的中间每一列值即从第二列j=1开始,到倒数第二列即j=i-1值都是(i,j) = (i-1, j-1) + (i-1, j),即左上角加右上角。
C++代码:
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:6.4 MB, 在所有 C++ 提交中击败了55.13%的用户
通过测试用例:14 / 14
class Solution {
public:
vector<vector<int>> generate(int numRows) {
// 特殊情况
if (numRows == 1) return {{1}};
if (numRows == 2) return {{1}, {1, 1}};
// 从第三行开始,即i=2开始
vector<vector<int>> ans = {{1}, {1,1}};
for (int i=2; i < numRows; i++)
{
vector<int> child_ans = {1}; // 每一行开头都是1.
for (int j=1; j < i; j++) // 每一行,从第2个即j=1开始,到倒数第2个结束,值都是(i,j) = (i-1,j-1) + (i-1,j)
child_ans.push_back(ans[i-1][j-1] + ans[i-1][j]);
child_ans.push_back(1); // 每一行结束都是1.
ans.push_back(child_ans);
}
return ans;
}
};
python代码
执行用时:16 ms, 在所有 Python 提交中击败了62.93%的用户
内存消耗:13.1 MB, 在所有 Python 提交中击败了47.86%的用户
通过测试用例:14 / 14
class Solution(object):
def generate(self, numRows):
"""
:type numRows: int
:rtype: List[List[int]]
"""
# 特例
if numRows == 1: return [[1]]
elif numRows == 2: return [[1], [1, 1]]
# 行数i索引是0开始
# 从第三行,即i=2开始,每一行的开头和结束都是1,
# 当前行的中间每一列值(i,j) = (i-1, j-1) + (i-1, j),即左上角加右上角。
# 只要j<numRows-1则循环赋值.
ans = [[1], [1, 1]]
for i in range(2, numRows): # # 从第三行,即i=2开始
child_ans = [1] # 每一行的开头是1
for j in range(1, i): # 每一行的中间即从第二行j=1开始,到倒数第二行即j=i-1,都是左上角加右上角.
child_ans.append(ans[i-1][j-1] + ans[i-1][j])
child_ans.append(1) # 每一行的结束是1
ans.append(child_ans)
return ans