📜  最大乘积子数组的长度

📅  最后修改于: 2021-09-07 02:04:22             🧑  作者: Mango

给定一个大小为N的整数数组arr[] ,任务是找到元素乘积非零的最大长度子数组。 .
例子:

方法:

  1. 保存输入数组中所有零的索引。
  2. 最长子数组必须位于以下三个范围内:
    • 从零索引开始并在第一个零索引 – 1 处结束。
    • 位于两个零索引之间。
    • 从最后一个零索引 + 1 开始并在 N-1 结束。
  3. 最后从所有情况中找到最大长度。

这是上述方法的实现:

C++
// C++ program to find maximum
// length subarray having non
// zero product
#include
using namespace std;
 
// Function that returns the
// maximum length subarray
// having non zero product
void Maxlength(int arr[],int N)
{
    vector zeroindex;
    int maxlen;
     
    // zeroindex list to store indexex
    // of zero
    for(int i = 0; i < N; i++)
    {
        if(arr[i] == 0)
            zeroindex.push_back(i);
    }
             
    if(zeroindex.size() == 0)
    {
         
        // If zeroindex list is empty
        // then Maxlength is as
        // size of array
        maxlen = N;
    }
     
    // If zeroindex list is not empty
    else
    {
         
        // for example list 1 1 0 0 1
        // is on indexex 0 1 2 3 4
         
        // first zero is on index 2
        // that means two numbers positive,
        // before index 2 so as
        // their product is positive to
        maxlen = zeroindex[0];
         
        // Checking for other indexex
        for(int i = 0;
                i < zeroindex.size() - 1; i++)
        {
             
            // If the difference is greater
            // than maxlen then maxlen
            // is updated
            if(zeroindex[i + 1]-
               zeroindex[i] - 1 > maxlen)
            {
                maxlen = zeroindex[i + 1] -
                         zeroindex[i] - 1;
            }
        }
         
        // To check the length of remaining
        // array after last zeroindex
        if(N - zeroindex[zeroindex.size() - 1] -
           1 > maxlen)
        {
            maxlen = N - zeroindex[
                         zeroindex.size() - 1] - 1;
        }
    }
    cout << maxlen << endl;
}
 
// Driver Code
int main()
{
    int N = 9;
    int arr[] = {7, 1, 0, 1, 2, 0, 9, 2, 1};
     
    Maxlength(arr, N);
}
     
// This code is contributed by Surendra_Gangwar


Java
// Java program to find maximum
// length subarray having non
// zero product
import java.util.*;
 
class GFG{
 
// Function that returns the
// maximum length subarray
// having non zero product
static void Maxlength(int arr[],int N)
{
    Vector zeroindex = new Vector();
     
    int maxlen;
     
    // zeroindex list to store indexex
    // of zero
    for(int i = 0; i < N; i++)
    {
        if (arr[i] == 0)
            zeroindex.add (i);
    }
             
    if (zeroindex.size() == 0)
    {
         
        // If zeroindex list is empty
        // then Maxlength is as
        // size of array
        maxlen = N;
    }
     
    // If zeroindex list is not empty
    else
    {
         
        // for example list 1 1 0 0 1
        // is on indexex 0 1 2 3 4
         
        // first zero is on index 2
        // that means two numbers positive,
        // before index 2 so as
        // their product is positive to
        maxlen = (int)zeroindex.get(0);
         
        // Checking for other indexex
        for(int i = 0;
                i < zeroindex.size() - 1; i++)
        {
             
            // If the difference is greater
            // than maxlen then maxlen
            // is updated
            if ((int)zeroindex.get(i + 1) -
                (int)zeroindex.get(i) - 1 > maxlen)
            {
                maxlen = (int)zeroindex.get(i + 1) -
                         (int)zeroindex.get(i) - 1;
            }
        }
         
        // To check the length of remaining
        // array after last zeroindex
        if (N - (int)zeroindex.get(
                     zeroindex.size() - 1) -
                                    1 > maxlen)
        {
            maxlen = N - (int)zeroindex.get(
                              zeroindex.size() - 1) - 1;
        }
    }
    System.out.println(maxlen);
}
 
// Driver code
public static void main(String args[])
{
    int N = 9;
    int arr[] = { 7, 1, 0, 1, 2, 0, 9, 2, 1 };
     
    Maxlength(arr, N);
}
}
 
// This code is contributed by amreshkumar3


Python3
# Python3 program to find
# maximum length subarray
# having non zero product
 
# function that returns the
# maximum length subarray
# having non zero product
def Maxlength(arr, N):
     
    zeroindex =[]
     
    # zeroindex list to store indexex
    # of zero
    for i in range(N):
        if(arr[i] == 0):
            zeroindex.append(i)
             
     
    if(len(zeroindex) == 0):
        # if zeroindex list is empty
        # then Maxlength is as
        # size of array
        maxlen = N
    # if zeroindex list is not empty
    else:
        # for example list 1 1 0 0 1
        # is on indexex 0 1 2 3 4
         
        # first zero is on index 2
        # that means two numbers positive,
        # before index 2 so as
        # their product is positive to
         
        maxlen = zeroindex[0]
         
        # checking for other indexex
        for i in range(0, len(zeroindex)-1):
             
            # if the difference is greater
            # than maxlen then maxlen
            # is updated
            if(zeroindex[i + 1]\
               - zeroindex[i] - 1\
               > maxlen):
                maxlen = zeroindex[i + 1]\
                         - zeroindex[i] - 1
             
         
        # to check the length of remaining
        # array after last zeroindex
        if(N - zeroindex[len(zeroindex) - 1]\
                                 - 1 > maxlen):
            maxlen = N\
             - zeroindex[len(zeroindex) - 1] - 1
     
    print(maxlen)
 
 
# Driver Code
if __name__ == "__main__":
    N = 9
    arr = [7, 1, 0, 1, 2, 0, 9, 2, 1]
    Maxlength(arr, N)


C#
// C# program to find maximum
// length subarray having non
// zero product
using System;
using System.Collections.Generic;
 
class GFG{
 
// Function that returns the
// maximum length subarray
// having non zero product
static void Maxlength(int []arr,int N)
{
    int[] zeroindex = new int[20000];
    int maxlen;
     
    // zeroindex list to store indexex
    // of zero
    int size = 0;
    for(int i = 0; i < N; i++)
    {
        if (arr[i] == 0)
            zeroindex[size++] = i;
    }
             
    if (size == 0)
    {
         
        // If zeroindex list is empty
        // then Maxlength is as
        // size of array
        maxlen = N;
    }
     
    // If zeroindex list is not empty
    else
    {
         
        // for example list 1 1 0 0 1
        // is on indexex 0 1 2 3 4
         
        // first zero is on index 2
        // that means two numbers positive,
        // before index 2 so as
        // their product is positive to
        maxlen = zeroindex[0];
         
        // Checking for other indexex
        for(int i = 0; i < size; i++)
        {
             
            // If the difference is greater
            // than maxlen then maxlen
            // is updated
            if (zeroindex[i + 1]-
                zeroindex[i] - 1 > maxlen)
            {
                maxlen = zeroindex[i + 1] -
                         zeroindex[i] - 1;
            }
        }
         
        // To check the length of remaining
        // array after last zeroindex
        if (N - zeroindex[size - 1] - 1 > maxlen)
        {
            maxlen = N - zeroindex[size - 1] - 1;
        }
    }
    Console.WriteLine(maxlen);
}
 
// Driver code
public static void Main()
{
    int N = 9;
    int []arr = { 7, 1, 0, 1, 2, 0, 9, 2, 1 };
     
    Maxlength(arr, N);
}
}
 
// This code is contributed by amreshkumar3


Javascript


输出:

3

时间复杂度: O(N)
辅助空间: O(N)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live