力扣119. 杨辉三角 II(动态规划)
https://leetcode-cn.com/problems/pascals-triangle-ii/
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
进阶:
你可以优化你的算法到 O(k) 空间复杂度吗?
动态规划
总的来说就是利用杨辉三角形后一行与前一行的关系。
更新过程为:从倒数第二个元素开始往前更新,它等于原来这个位置的数 + 前一个位置的数
行[i] = 行[i] + 行[i-1]
#include "stdafx.h"
#include<vector>
#include <iostream>
using namespace std;
class Solution
{
public:
//动态规划
vector<int> getRow(int rowIndex)
{
//第rowIndex行的vector大小为 rowIndex+1
vector<int>result(rowIndex + 1);
//头部
result[0] = 1;
//从后往前赋值
//第i行的第j个=第i-1行的第j个+第i-1行的第j-1个
for (int i = 0; i <= rowIndex; i++)
{
//尾部
result[i] = 1;
for (int j = i - 1; j > 0; j--)
{
result[j] = result[j - 1] + result[j];
}
}
return result;
}
};
int main()
{
Solution s;
auto result = s.getRow(3);
for (int j = 0; j < result.size(); j++)
{
cout << result[j] << '\t';
}
return 0;
}
递归,超时严重
//递归,超时严重
vector<int> getRow(int rowIndex)
{
//鲁棒性rowIndex == 0,第0行
if (rowIndex <= 0)
{
vector<int>resulttemp;
resulttemp.push_back(1);
return resulttemp;
}
//递归终止条件,rowIndex == 1,数组1,1
if (rowIndex == 1)
{
vector<int>resulttemp;
resulttemp.push_back(1);
resulttemp.push_back(1);
return resulttemp;
}
vector<int>result;
//首尾是1
result.push_back(1);
//第k行的第i个=第k-行的第i-1个+第k-行的第i个
for (int i = 1; i <= rowIndex - 1; i++)
{
result.push_back(getRow(rowIndex-1)[i-1]+ getRow(rowIndex-1)[i]);
}
result.push_back(1);
return result;
}