题目:
1.
1
1 1 1
1 2 3 2 1
1 3 6 7 6 3 1
1 4 10 16 19 16 10 4 1
NOWCODER.COM
牛客网·互联网名企笔试/面试题库
牛客出品-http://www.nowcoder.com
以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数,左上角数到右上角的
数,3个数之和(如果不存在某个数,认为该数就是0)。
求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。
分析:
方法(1):
void triangle_matirx1(int rows)
{
//生成这样的阵列,规律是:当前元素=上一行的这一列+上一行的前一列+上一行的前两列
vector<vector<int>> vv;//相当于二维数组
vv.resize(rows);//设置大vector数据
for (int i = 0; i < vv.size(); i++)
{
vv[i].resize(2*i+1, 0);
vv[i][0] = 1;
}
for (int i = 1; i < vv.size(); i++)
{
for (int j = 1; j < vv[i].size(); j++)
{
int tmp = 0;
//以下三个if是判断上一行的前2列,前1列,当前列下标是否合法
if (j - 1 >= 0 && j - 1 < vv[i - 1].size())
{
tmp = vv[i - 1][j - 1];
}
if (j - 2 >= 0 && j - 2 < vv[i - 1].size())
{
tmp+= vv[i - 1][j - 2];
}
if (j >= 0 && j < vv[i - 1].size())
{
tmp += vv[i - 1][j];
}
vv[i][j] = tmp;
}
}
//寻找每个小vector中第一次出现偶数的位置
for (int j = 0; j < vv[rows - 1].size(); j++)
{
if (vv[rows - 1][j] % 2 == 0)
{
cout << j + 1 << endl;
break;
}
}
}
方法(2):
//方法(2):由于每个小vector的数据个数一样,而当前元素=上一行的这一列+上一行的前一列+上一行的前两列
//可能对上一行访问越界,因此我们给每个vector开的空间大小都是以最大的那个vector为主,
//并且将第二列初始化为1,第一列空出来初始化为0,用来防止越界的。
void triangle_matirx2(int rows)
{
vector<vector<int>> vv;//相当于二维数组
vv.resize(rows);//设置大vector数据
for (int i = 0; i < vv.size(); i++)
{
vv[i].resize(2 * rows, 0);
vv[i][1] = 1;//将第二列置1,即第一列空出来
}
for (int i = 1; i < vv.size(); i++)
{
for (int j = 2; j < vv[i].size(); j++)
{
vv[i][j] = vv[i - 1][j - 2] + vv[i - 1][j - 1] + vv[i - 1][j];
}
}
for (int j = 2; j < vv[rows - 1].size(); j++)
{
if (vv[rows - 1][j] % 2 == 0)
{
cout << j << endl;
break;
}
}
}