如果给出一个数组。如何在递归期间跟踪位置。你还将如何跟踪最长连胜。
Ex:给出一个大小为16 {1,0,1,1,1,0,0,0,1,1,0,0,1,1,0,1}的数组 答案是指数2位置的长度为3的条纹。
这是我所做的迭代解决方案。它运作得很好。
int* iterative(int arr[],int length)
{
int temppos = 0;
int pos = 0;
int templen = 0;
int len = 0;
for(int i=0;i<length;i++)
{
if(arr[i]==1)
{
templen++;
if(templen>len)
{
len=templen;
pos=temppos;
}
}
else
{
templen=0;
temppos=i+1;;
}
}
static int x[2]= {pos,len};
return x;
}
这是我在递归解决方案中的伪代码尝试。
int[] recursive(int[] array, int position, int streak)
{
if(array length is equal to 1 && arr[0]==1)
return result(position,streak)
else
leftsubarray(array/2)
rightsubarray(array/2+1)
}
给出迭代解决方案。我的基本情况和递归步骤应该是什么。
答案 0 :(得分:0)
这是您问题的 C ++ 中的迭代解决方案。结构ans
用于存储索引i
和条纹长度streak
。
#include <iostream>
using namespace std;
typedef struct {
int i;
int streak;
} ans;
ans *a= new ans;
void find_streak(int arr[],int i,int s)
{
if(arr[i]==1)
{
s++;
}
if(arr[i]==0 || i==15) //checking for end of streak or array
{
if(s>a->streak) //checking if the current streak is greater than max
{
a->streak=s;
a->i=i-s;
}
s=0; // initializing s to 0 for new streak
}
if(i+1<16)
find_streak(arr,i+1,s);
else
return;
}
int main()
{
int arr[]={1,0,1,1,1,0,0,0,1,1,0,0,1,1,1,1};
a->i=0;a->streak=0;
find_streak(arr,0,0);
cout<<"Index: "<<a->i<<" streak: "<<a->streak<<endl;
}