题目
思路
最初其实就是用力扣118中的方法,定义二维数组来存储。
考虑优化空间复杂度,仅使用一维的数组来计算。
由于使用的一维数组,那么新计算的和肯定是会覆盖掉之前的值的,所以关键在于当每次计算完新和后,要记录下一次要用于计算的两个值,这里用org1与org2表示。
- 设org1与org2的初值分别为数组中的前两个元素
- 循环计算新和,并保存在数组中(直接覆盖掉前面的值),然后更新org1与org2
显然,杨辉三角每次用于和计算的两个值都是紧挨着的,那么,下次用于计算的org1等于本次用于计算的org2
而org2直接就是数组当前位置的下一个即vec[i+1]
C++代码
#include<iostream>
#include<vector>
using namespace std;
vector<int> getRow(int rowIndex) {
vector<vector<int> > vecs(rowIndex+1);
vecs[0].emplace_back(1);
// if(numRows==1) return vecs;
for(int i=1;i<rowIndex+1;i++){
vecs[i].resize(i+1);
vecs[i][0]=1;//每行第一个元素均为1
vecs[i][i]=1;//每行最后一个元素均为1
for(int j=1;j<i;j++){
vecs[i][j]=vecs[i-1][j-1]+vecs[i-1][j];
}
}
return vecs[rowIndex];
}
vector<int> getRow1(int rowIndex) {
vector<int> vec;
vec.emplace_back(1);
int cnt=0;
while(cnt<rowIndex){
int i=1;
int org1=vec[0],org2=vec[1];
while(i<=cnt){
vec[i]=org1+org2;
//每次计算完新和后,更新下一次要用于和计算的两个值
org1=org2;
org2=vec[i+1];
i++;
}
vec.emplace_back(1);
cnt++;
}
return vec;
}
int main(){
int n;
cin>>n;
vector<int> num = getRow1(n);
for(int i=0;i<num.size();i++){
cout<<num[i]<<" ";
}
return 0;
}
9.1更 终于get到官网题解的优化方法了
class Solution {
public List<Integer> getRow(int rowIndex) {
List<List<Integer>> tri = new ArrayList<List<Integer>>();
for(int i=0;i<=rowIndex;i++){
List<Integer> row=new ArrayList<Integer>();
for(int j=0;j<=i;j++){
if(j==0||j==i) row.add(1);
else {
row.add(tri.get(i-1).get(j-1)+tri.get(i-1).get(j));
}
}
tri.add(row);
}
return tri.get(rowIndex);
}
}
//优化--滚动数组
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> pre=new ArrayList<Integer>();
for(int i=0;i<=rowIndex;i++){
List<Integer> cur=new ArrayList<Integer>();
for(int j=0;j<=i;j++){
if(j==0||j==i) cur.add(1);
else {
cur.add(pre.get(j-1)+pre.get(j));
}
}
pre=cur;
}
return pre;
}
}
//进一步优化--仅用1个数组
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> row = new ArrayList<Integer>();
row.add(1);
for(int i=1;i<=rowIndex;i++){
row.add(0);//先占最后一个位置 设为0
for(int j=i;j>0;j--){
row.set(j, row.get(j-1)+row.get(j));
}
}
return row;
}
}