数组中最长的区间,满足该区间内的数排序后是连续的。比如,[23, 4,1,3,2,9,8,24] 4,1,3,2 是最长区间,是连在一起的。[23, 1,3,2,9,4,8,24] 就只能返回1,2,3了。
这里考虑到数组没有重复的,如果数有重复的话,目前还没有想到好的方法。
应该有更好的算法,救大神指教
从x0开始,找length=|x0-x1|+1内的max和min,length大于数列长度则否定x0,再从x1向后开始找;1_如果max-min+1=length,则区间连续,记录length,继续向后添加一个元素,判断是否为max+1或min-1,若是,则length++,继续向后并更新max或min,直到否或数列尾,若否,则更新max,或者是min,继续在x1后开始找。
// TestAcm.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <iostream>
using namespace std;
// 数组中最长的区间,满足该区间内的数排序后是连续的。比如,
// [23, 4,1,3,2,9,8,24] 4,1,3,2 是最长区间,是连在一起的。
// [23, 1,3,2,9,4,8,24] 就只能返回1,2,3了。
void Cal(int a[], int length)
{
int begin = -1;
int end = -1;
int lengthEnd = 0;
int lengthTemp = 0;
int beginTemp = -1;
int endTemp = -1;
for (int i = 0; i < length;)
{
int maxA = a[i];
int minA = a[i];
for (int j = i + 1; j < length;)
{
if (a[j] > maxA)
maxA = a[j];
else if (a[j] < minA)
minA = a[j];
if (maxA - minA + 1 > length)
break;
if (maxA - minA == j - i)
{
beginTemp = i;
endTemp = j;
lengthTemp = maxA - minA + 1;
while ( (++j) < length)
{
if (a[j] == minA -1)
{
minA = a[j];
endTemp = j;
++lengthTemp;
}
else if (a[j] == maxA + 1)
{
maxA = a[j];
endTemp = j;
++lengthTemp;
}
else
break;
}
}
else
++j;
}
if (lengthTemp != 0)
{
if (lengthTemp > lengthEnd)
{
lengthEnd = lengthTemp;
begin = beginTemp;
end = endTemp;
}
if (i + lengthTemp > length)
break;
i = i + lengthTemp;
lengthTemp = 0;
}
else
++i;
}
if (begin != -1 && end != -1)
{
for (; begin <= end; ++begin)
cout << a[begin];
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {23, 1,3,2,9,4,8,24};
Cal(a, 8);
system("pause");
return 0;
}