描述
以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数、左上角数和右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。
求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3,输入2则输出-1。
数据范围: 1≤n≤10^9
输入描述:
输入一个int整数
输出描述:
输出返回的int值
示例1
输入:
4
输出:
3
解题思路:
本题比杨辉三角难度大一些,主要体现在数据范围太大,如果用解杨辉三角题目时候的思路去解这道题,会出现内存不足或运行超时的问题,这两个问题笔者都遇到了,一开始使用的是在栈上开辟二维数组,只能通过一部分测试用例(n较小时),之后就超出内存要求了,于是笔者决定用动态内存分配在堆上开辟空间,并在用完后及时释放,再次提交,能够通过的测试用例比之前更多了,大概84%,内存完全足够,但是运行超时了。
以下为只能通过84%用例的错误代码,正确代码在之后会有:
#include <stdio.h>
#include <stdlib.h>
#define N 10000000
int main()
{
int i,n,j,*p[N],flag=-1;
scanf("%d",&n);
for(i=0;i<n;i++)
{
p[i]=(int*)malloc(sizeof(int)*(2*i+3));
if(i==0)
{
p[0][0]=1;
}
else
{
for(j=0;j<=i;j++)
{
if(j==0)
{
p[i][2*i-j]=p[i][j]=p[i-1][j];
}
else if(j==1)
{
p[i][2*i-j]=p[i][j]=p[i-1][j]+p[i-1][j-1];
}
else
{
p[i][2*i-j]=p[i][j]=p[i-1][j]+p[i-1][j-1]+p[i-1][j-2];
}
}
}
for(j=(2*i+1);j<(2*i+3);j++)
{
p[i][j]=0;
}
if(i>=2)
{
free(p[i-2]);
p[i-2]=NULL;
}
}
for(j=0;j<(2*n-1);j++)
{
if(p[n-1][j]%2==0)
{
flag=j+1;
break;
}
}
printf("%d\n",flag);
return 0;
}
以下为正确代码的解题思路:
仔细观察变形的杨辉三角后,我们可以发现,除了第1第2行的元素没有偶数,其他行都有偶数,并且偶数出现的位置是2,3,2,4循环往复的,了解了这一点,代码就很简单了:
#include <stdio.h>
int main()
{
long long n;
int flag=-1;
scanf("%ld",&n);
if(n>=3) //n如果等于1或2,则没有偶数,flag为-1保持不变
{
n-=2; //减去第1和第2行,之后对4取余
if(n%4==1||n%4==3)
flag=2;
else if(n%4==2)
flag=3;
else if(n%4==0)
flag=4;
}
printf("%d\n",flag);
return 0;
}