如何求解一个数组里面特定的值?还要考虑它的容错性!

怎么求解一个数组里面特定的值?还要考虑它的容错性!!
如题:::
     我现在有这样一组数组,里面的值是这样的: 1 3 2 9 4 6 9 8 9 7 5 6 9 1 4 2 5 1 6 2一共20个数。我要把连续的大于等于5的值的个数求出来,在这例子中应该是是 6 9 8 9 7 5 6 9,但是我们观察到前面有一个9,4这两个数,中间夹着4这个数,虽然比5小,但是如果比5小的个数不超过2个,我们还是认为它跟后面一大串大于等于5是连续的。就像我们这个例子,实际连续大于等于5的应该是9 4 6 9 8 9 7 5 6 9到这个地方,而后面则不符合条件。。。。这就是我所谓的容错性。
   请问有什么思路可以解决这样的问题。。用C++怎么实现这样的算法!!!
------解决方案--------------------
如果有两个符合要求的串,是要取长度更长的那个吗?按照你题目的要求,一个数字串里很可能存在多个符合要求的。
基本算法思路是:
1、找到第一个大于5的位置iStart,使用计数iDis统计后面跟着的比5小的个数,初始化为0.
2、判断下一个是否大于5,如果是则长度iNumLen+1;如果不是则距离iDis+1,判断iDis是否大于2,如果是则iLen=iLen-iDis,然后根据iStart和iLen把符合要求的字符串取出来,如果小于等于2,则度iNumLen+1,继续判断下一个。
3、如果找到多个符合要求的数字串,需要一个临时数组来保存上一个结果,如果当前找到的数字串比上一个长,则替换。
4、把最终的临时数组作为结果输出。
------解决方案--------------------
1归一化,将大于等于5的设置为1,将小于5的设置为0;if(data[i] >= 5 )
 1 3 2 9 4 6 9 8 9 7 5 6 9 1 4 2 5 1 6 2 =》
 0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0

2 对于值为1的保持不变,对于值为0的,则由它的左右两边的值的&&运算来确定。首尾位不变。
 0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0=>
 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 0

3将上述结果为1的转换成原来对应的data值。

int tempData[20]={0};
for(int i=0;i<20;i++)
{
   if(data[i] >= 5 )
   {
     tempData[i]=1;
  }
}

for(int i=1;i<19;i++)
{
   if(tempData[i] == 0)
   {
     tempData[i]=tempData[i-1] && tempData[i+1];
  }
}

for(int i=1;i<19;i++)
{
   if(tempData[i] == 1)
   {
      //这个i就是转化后保留的下标
  }
}
------解决方案--------------------
引用:
Quote: 引用:

1归一化,将大于等于5的设置为1,将小于5的设置为0;if(data[i] >= 5 )
 1 3 2 9 4 6 9 8 9 7 5 6 9 1 4 2 5 1 6 2 =》
 0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0

2 对于值为1的保持不变,对于值为0的,则由它的左右两边的值的&&运算来确定。首尾位不变。
 0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0=>
 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 0

3将上述结果为1的转换成原来对应的data值。



int tempData[20]={0};
for(int i=0;i<20;i++)
{
   if(data[i] >= 5 )
   {
     tempData[i]=1;
  }
}

for(int i=1;i<19;i++)
{
   if(tempData[i] == 0)
   {
     tempData[i]=tempData[i-1] && tempData[i+1];
  }
}

for(int i=1;i<19;i++)
{
   if(tempData[i] == 1)
   {
      //这个i就是转化后保留的下标
  }
}

你这样归一化之后不是已经把数组里面的值改变了吗?而且如果我数组里面的元素是动态的话,又改怎么办?

tempData是data的副本。
不知道你应用的场合是什么,如果是图像或者声音处理,边界要求不严格的话,直接用一个模板套上去对这个序列信号做运算是最快的。
------解决方案--------------------
你的意思是
1)找连续两个序列间距不超过2的序列,求总长度最长的那两个?
2)还是找到最长序列,如果和前面或者后面的序列间距小于2,把他们粘贴到一起 。
楼上回答的是第二个问题。

第一个问题
分为1)单序列最长 
以及2)两个间距不超过2的序列中,最长那个
求出二者中最长的,作为结果 
------解决方案--------------------
可以限定段长度,把主函数注释的if加上就行,这次可以打印所有段。并且提供的数组使用了vector,可以比较方便地接受动态数据。
#include<iostream>
#include<vector>
using namespace std;

#define COMPARE 5

bool is_Error(vector<int> num, int position){   //为误差
if (position == 0 
------解决方案--------------------
 position == num.size() - 1)
return false;
if (num[position - 1] < COMPARE&&num[position + 1] < COMPARE)
return false;
if (position>1 && num[position - 2] < COMPARE&&num[position - 1] < COMPARE)
return false;
if (position < num.size() - 2 && num[position + 1] < COMPARE&&num[position + 2] < COMPARE)
return false;
return true;
}

void Get_Longest(vector<int> num, int* start, int *length){  //
int curr_length = 0;
bool search = true;
for (int i = *start; i < num.size(); ++i){