目录
杨辉三角的变形
解法1(超出内存限制)
按照题目意思,可以发现第n行有2n - 1个元素,第i,j元素等于上一行第j - 2,j - 1,j三列元素之和,每一行的第一列和最后一列都为1,如果是第二列,则只是两个元素之和。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n = 0;
cin >> n;
vector<vector<int>> vv(n);
for (int i = 0; i < n; ++i)
{
vector<int> tmp(i + 1, 1);
vv[i] = tmp;
}
for (int i = 2; i < n; ++i)
{
for (int j = 1; j < i + 1; ++j) // 只需填到中间
{
if (j == 1) // 第二列
vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];
else if (j == i) // 最后中间列(最后一列)
vv[i][j] = vv[i - 1][j - 1] + vv[i - 1][j - 2] * 2;
else
vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1] + vv[i - 1][j - 2];
}
}
// for(int i = 0; i < n; ++i)
// {
// for(int j = 0; j < vv[i].size(); ++j)
// {
// cout << vv[i][j] << ' ';
// }
// cout << endl;
// }
int len = vv[n - 1].size();
for (int i = n - 1, j = 1; j < len; ++j)
{
if (vv[i][j] % 2 == 0)
{
cout << j + 1;
return 0;
}
}
cout << -1;
return 0;
}
解法2(找规律)
由于牛客更新了测试用例,加强了内存限制,因此上述用例在运行时会超出内存限制,所以上述使用生成杨辉三角,然后在第n行上寻找偶数的方式已经不合适,故进行更正。通过以上的数据分析规律为 {-1,-1,2,3,2,4,2,3,2,4,...} ,即第n行上偶数所在的下标。