题目:
一个无序自然数组,比如[100,2,1,3]在时间复杂度为O(n)的条件下,求出最大连续自然数个数。
如本题输出结果为:3.
//
#include <iostream>
#include <cstring>
using namespace std;
int Max_Length(int a[],int max,int n);//函数声明,计算最大的连续自然数长度
int main()
{
int a[]={100,2,3,1,4,8,5,9,10,22,7,23,54,0};
int max=0;//保存数组中最大元素值
int n=(sizeof(a)/sizeof(int));//计算数组长度
for(int i=0;i<n;i++)
{
if(a[i]>max)
max=a[i];
}
int Number;
Number=Max_Length(a,max,n);
printf("%d\n",Number);
return 0;
}
int Max_Length(int a[],int max,int n)
{
//不能根据max建立数组,因为建立数组的时候,
//元素个数必须是常量。我想到了动态分配内存
int* b=NULL;
b=(int*)malloc((max+1)*sizeof(int));
//memset是按字节设置的,可以全0,可以全-1,设成其他的值会有影响,如果int是4字节的
//32位全0还是0,而如果设置-1一样的道理,每一位都是1,32位全1,最终还是代表-1,设置成其他的就容易出错。
//主要因为memset是按字节设置值的。
memset(b,-1,(max+1)*(sizeof(int)));
for(int i=0;i<n;i++)
{
b[a[i]]=a[i];
}
int MaxLength=0;
int tmp=0;
for(i=0;i<=max;i++)
{
if(b[i]!=-1)
{
tmp+=1;
}
else
{
tmp=0;
}
if(tmp>MaxLength)
{
MaxLength=tmp;
}
}
free(b);//释放指针
return MaxLength;
}
欢迎用其他方法的同仁讨论。。。