Given a binary array arr[] of size N, the task is to find the length of the second longest sequence of consecutive 1s present in the array.
Examples:
Input: arr[] = {1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0}
Output: 4 3
Explanation:
Longest sequence of consecutive ones is 4 i.e {arr[7], … arr[10]}.
Second longest sequence of consecutive ones is 3 i.e {arr[0], … arr[2]}.Input: arr[] = {1, 0, 1}
Output: 1 0
Approach: The idea is to traverse the given binary array and keep track of the largest and the second largest length of consecutive one’s encountered so far. Below are the steps:
- Initialise variables maxi, count and second_max to store the length of the longest, current and second longest sequence of consecutive 1s respectively..
- Iterate over the given array twice.
- First, traverse the array from left to right. For every 1 encountered, then increment count and compare it with maximum so far. If 0 is encountered, reset count as 0.
- In the second traversal, find the required second longest count of consecutive 1’s following the above procedure.
Below is the implementation of the above approach:
C++
// C++ implementation of the above approach#include <bits/stdc++.h>using namespace std;// Function to find maximum// and second maximum lengthvoid FindMax(int arr[], int N){ // Initialise maximum length int maxi = -1; // Initialise second maximum length int maxi2 = -1; // Initialise count int count = 0; // Iterate over the array for (int i = 0; i < N; ++i) { // If sequence ends if (arr[i] == 0) // Reset count count = 0; // Otherwise else { // Increase length // of current sequence count++; // Update maximum maxi = max(maxi, count); } } // Traverse the given array for (int i = 0; i < N; i++) { // If sequence continues if (arr[i] == 1) { // Increase length // of current sequence count++; // Update second max if (count > maxi2 && count < maxi) { maxi2 = count; } } // Reset count when 0 is found if (arr[i] == 0) count = 0; } maxi = max(maxi, 0); maxi2 = max(maxi2, 0); // Print the result cout << maxi2;}// Driver Codeint main(){ // Given array int arr[] = { 1, 1, 1, 0, 0, 1, 1 }; int N = sizeof(arr) / sizeof(arr[0]); // Function Call FindMax(arr, N); return 0;} |
Java
// Java implementation of the above approachimport java.io.*; import java.util.*; class GFG{ // Function to find maximum// and second maximum lengthstatic void FindMax(int arr[], int N){ // Initialise maximum length int maxi = -1; // Initialise second maximum length int maxi2 = -1; // Initialise count int count = 0; // Iterate over the array for(int i = 0; i < N; ++i) { // If sequence ends if (arr[i] == 0) // Reset count count = 0; // Otherwise else { // Increase length // of current sequence count++; // Update maximum maxi = Math.max(maxi, count); } } // Traverse the given array for(int i = 0; i < N; i++) { // If sequence continues if (arr[i] == 1) { // Increase length // of current sequence count++; // Update second max if (count > maxi2 && count < maxi) { maxi2 = count; } } // Reset count when 0 is found if (arr[i] == 0) count = 0; } maxi = Math.max(maxi, 0); maxi2 = Math.max(maxi2, 0); // Print the result System.out.println( maxi2);}// Driver code public static void main(String[] args) { int arr[] = { 1, 1, 1, 0, 0, 1, 1 }; int n = arr.length; FindMax(arr, n);} } // This code is contributed by Stream_Cipher |
Python3
# Python3 implementation of the above approach# Function to find maximum# and second maximum lengthdef FindMax(arr, N): # Initialise maximum length maxi = -1 # Initialise second maximum length maxi2 = -1 # Initialise count count = 0 # Iterate over the array for i in range(N): # If sequence ends if (arr[i] == 0): # Reset count count = 0 # Otherwise else: # Increase length # of current sequence count += 1 # Update maximum maxi = max(maxi, count) # Traverse the given array for i in range(N): # If sequence continues if (arr[i] == 1): # Increase length # of current sequence count += 1 # Update second max if (count > maxi2 and count < maxi): maxi2 = count # Reset count when 0 is found if (arr[i] == 0): count = 0 maxi = max(maxi, 0) maxi2 = max(maxi2, 0) # Print the result print(maxi2)# Driver Codeif __name__ == '__main__': # Given array arr = [1, 1, 1, 0, 0, 1, 1] N = len(arr) # Function Call FindMax(arr, N)# This code is contributed by Mohit Kumar29 |
C#
// C# implementation of the above approachusing System.Collections.Generic; using System; class GFG{ // Function to find maximum// and second maximum lengthstatic void FindMax(int []arr, int N){ // Initialise maximum length int maxi = -1; // Initialise second maximum length int maxi2 = -1; // Initialise count int count = 0; // Iterate over the array for(int i = 0; i < N; ++i) { // If sequence ends if (arr[i] == 0) // Reset count count = 0; // Otherwise else { // Increase length // of current sequence count++; // Update maximum maxi = Math.Max(maxi, count); } } // Traverse the given array for(int i = 0; i < N; i++) { // If sequence continues if (arr[i] == 1) { // Increase length // of current sequence count++; // Update second max if (count > maxi2 && count < maxi) { maxi2 = count; } } // Reset count when 0 is found if (arr[i] == 0) count = 0; } maxi = Math.Max(maxi, 0); maxi2 = Math.Max(maxi2, 0); // Print the result Console.WriteLine( maxi2);}// Driver code public static void Main() { int []arr = { 1, 1, 1, 0, 0, 1, 1 }; int n = arr.Length; FindMax(arr, n);} } // This code is contributed by Stream_Cipher |
Javascript
<script>// JavaScript program to implement// the above approach// Function to find maximum// and second maximum lengthfunction FindMax(arr, N){ // Initialise maximum length let maxi = -1; // Initialise second maximum length let maxi2 = -1; // Initialise count let count = 0; // Iterate over the array for(let i = 0; i < N; ++i) { // If sequence ends if (arr[i] == 0) // Reset count count = 0; // Otherwise else { // Increase length // of current sequence count++; // Update maximum maxi = Math.max(maxi, count); } } // Traverse the given array for(let i = 0; i < N; i++) { // If sequence continues if (arr[i] == 1) { // Increase length // of current sequence count++; // Update second max if (count > maxi2 && count < maxi) { maxi2 = count; } } // Reset count when 0 is found if (arr[i] == 0) count = 0; } maxi = Math.max(maxi, 0); maxi2 = Math.max(maxi2, 0); // Print the result document.write( maxi2);}// Driver code let arr = [ 1, 1, 1, 0, 0, 1, 1 ]; let n = arr.length; FindMax(arr, n); // This code is contributed by target_2.</script> |
2
Time Complexity: O(N)
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
