给定大小为N的整数数组arr [] ,任务是查找元素元素乘积为非零的最大长度子数组。 。
例子:
Input: arr[] = [1, 1, 0, 2, 1, 0, 1, 6, 1]
Output: 3
Explanation
Possible subarray whose product are non zero are [1, 1], [2, 1] and [1, 6, 1]
So maximum possible length is 3.
Input: arr[] = [0, 1, 2, 1, 3, 0, 0, 1]
Output: 4
Explanation
Possible subarray whose product are non zero are [1, 2, 1, 3] and [1]
So maximum possible length is 4 .
方法:
- 保存输入数组中所有零的索引。
- 最长的子数组必须位于以下三个范围内:
- 从零索引开始,到第一个零索引– 1。
- 介于两个零索引之间。
- 从最后一个零索引+ 1开始,到N-1结束。
- 最终找到所有情况下的最大长度。
这是上述方法的实现:
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
输出:
3
时间复杂度: O(N)
辅助空间: O(N)