递归地在1d数组中找到1的最长条纹和初始位置

时间:2016-04-03 02:23:42

标签: java c++ arrays recursion

如果给出一个数组。如何在递归期间跟踪位置。你还将如何跟踪最长连胜。

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)
}

给出迭代解决方案。我的基本情况和递归步骤应该是什么。

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;
}