(一)题目描述
先给出可整合数组的定义。如果一个数组在排序之后,每相邻两个数差的绝对值都为1,则该数组为可整合数组。例如,[5,3,4,6,2]排序之后为[2,3,4,5,6],符合每相邻两个数差的绝对值都为1,所以这个数组为可整合数组。给定一个整型数组arr,请返回其中最大可整合子数组的长度。例如,[5,5,3,2,6,4,3]中最大可整合子数组为[5,3,2,6,4],所以返回5。
(二)思想
(1)若子数组中有重复的的元素,则不能将其整合.(可用Hash表等结果判断其元素是否重复)
(2)子数组的长度等于(最大值-最小值+1).
#include<iostream>
#include<map>
using namespace std;
int min(int x,int y)
{
int z=(x<y)?x:y;
return z;
}
int max(int x,int y)
{
int z=(x>y)?x:y;
return z;
}
int FindMax(int *Array,int length)
{
int len=0,i,j;
map<int,int>mvec;
for(i=0;i<length;i++)
{
int Max=0x80000000;
int Min=0x7fffffff;
for(j=i;j<length;j++)
{
if(mvec[Array[j]]!=0)
break;
mvec[Array[j]]++;
Min=min(Min,Array[j]);
Max=max(Max,Array[j]);
if(Max-Min==(j-i))
len=len>(j-i+1)?len:(j-i+1);
}
mvec.clear();
}
return len;
}
int main()
{
const int length=7;
int Array[length]={5,5,3,2,6,4,3};
cout<<FindMax(Array,length)<<endl;
}