Learn how to find the maximum consecutive one’s or zero’s in a circular binary array.
Example
Input: [1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1] Output: 5
There is a single one at the start and four one at the send so total five for circular array.
Solution for finding the maximum consecutive one’s in a circular array
A naive solution is two create an array of size 2 * n where n is the length of the actual array, and copy all the elements twice in it and then use the finding maximum one’s in a binary array on it.
An efficient solution.
Conceptually this how it works.
- Rather than using an array of size 2^n we can use modulus operator to iterate the array circularly.
- Iterate from 0 to 2*n and to count the one’s use following steps.
- Traverse from left to right.
- Everytime while traversing, calculate the current index as (i%n) in order to traverse the array circularly when i>n.
- If we encounter 1 we increase the count and update the maximum result otherwise we reset the counter.
- In some cases we can reduce the time complexity by breaking the loop when a[i] === 0 and i >= n.
const getMaxLength = (arr, n = arr.length) => { // Starting index let start = 0; // To store the maximum length of the // prefix of the given array with all 1s let preCnt = 0; while (start < n && arr[start] == 1) { preCnt++; start++; } // Ending index let end = n - 1; // To store the maximum length of the // suffix of the given array with all 1s let suffCnt = 0; while (end >= 0 && arr[end] == 1) { suffCnt++; end--; } //The array contains all n if (start > end) return n; // Find the maximum length subarray // with all 1s from the remaining not // yet traversed subarray let midCnt = 0; // To store the result for middle 1s let result = 0; for (let i = start; i <= end; i++) { if (arr[i] == 1) { midCnt++; result = Math.max(result, midCnt); } else { midCnt = 0; } } // (preCnt + suffCnt) is the subarray when // the given array is assumed to be circular return Math.max(result, preCnt + suffCnt); }
Input: const arr = [1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1]; console.log(getMaxLength(arr)); Output: 5
Time complexity: O(2 ^ n).
Space complexity: O(1).