杨慧三角变形题

题目:

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;
				}
			}
	
}

猜你喜欢

转载自blog.csdn.net/lyl194458/article/details/88828108