medium Longest Subarray of 1's After Deleting One Element
Problem Statement
Given a binary array nums, return the length of the longest non-empty subarray containing only 1's after removing 1 element from the array. Return 0 if there is no such subarray.
Examples
Example 1
- Input:
[1, 1, 0, 0, 1, 1] - Expected Output:
2 - Justification: By removing the first 0, you get
[1, 1, 0, 1, 1]and the longest sequence of 1s is[1, 1].
Example 2
- Input:
[1, 1, 0, 1, 1, 1] - Expected Output:
5 - Justification: By removing the first 0, you get
[1, 1, 1, 1, 1]which is the longest sequence of 1s .
Example 3
- Input:
[1, 0, 1, 1, 0, 1] - Expected Output:
3 - Justification: By removing the 0 between the first and third 1, you get
[1, 1, 1, 0, 1], which has a length of 3.
Try it yourself
Try solving this question here:
✅ Solution Longest Subarray of 1's After Deleting One Element
Problem Statement
Given a binary array nums, return the length of the longest non-empty subarray containing only 1's after removing 1 element from the array. Return 0 if there is no such subarray.
Examples
Example 1
- Input:
[1, 1, 0, 0, 1, 1] - Expected Output:
2 - Justification: By removing the first 0, you get
[1, 1, 0, 1, 1]and the longest sequence of 1s is[1, 1].
Example 2
- Input:
[1, 1, 0, 1, 1, 1] - Expected Output:
5 - Justification: By removing the first 0, you get
[1, 1, 1, 1, 1]which is the longest sequence of 1s .
Example 3
- Input:
[1, 0, 1, 1, 0, 1] - Expected Output:
3 - Justification: By removing the 0 between the first and third 1, you get
[1, 1, 1, 0, 1], which has a length of 3.
Constraints:
- 1 <= nums.length <= 105
- nums[i] is either 0 or 1.
Solution
To solve this problem, we'll use a sliding window technique to keep track of the longest segment of 1s, allowing for one 0 to be removed. We'll maintain a window defined by two pointers. If a 0 is encountered, we'll shift our window's start to the right past this 0. This approach ensures we consider every possible subarray where one 0 can be removed to get the longest segment of 1s.
This approach is effective because it efficiently narrows down the possible subarrays without requiring nested loops, which would increase the computational complexity. Instead, by moving pointers within a single pass through the list, we achieve a linear time solution, making it optimal for larger inputs.
Step-by-Step Algorithm
-
Initialize Pointers and Variables:
- Set two pointers,
leftandright, at the start of the list. - Create a variable
zeroCountto count zeros in the current window. - Create a variable
maxLento store the maximum length of 1s found.
- Set two pointers,
-
Iterate through the List:
- Move the
rightpointer across the list. - If
nums[right]is 0, incrementzeroCount.
- Move the
-
Adjust the Window:
- If
zeroCountexceeds 1, move theleftpointer to the right untilzeroCountis at most 1 again. - Adjust
zeroCountaccordingly by checking the value atnums[left].
- If
-
Update Maximum Length:
- Calculate the length of the current window (i.e.,
right - left). - Update
maxLenif the current window length is greater.
- Calculate the length of the current window (i.e.,
-
Return Result:
- Return
maxLen, which is the maximum length of a subarray containing only 1s after removing one element.
- Return
Algorithm Walkthrough
Using the example input [1, 0, 1, 1, 0, 1]:
-
Initial State:
left = 0,right = 0,zeroCount = 0,maxLen = 0- Array:
[1, 0, 1, 1, 0, 1]
-
Step 1:
- Move
rightto 0. nums[right]is 1, sozeroCountremains 0.- Current window:
[1] maxLen = max(0, 0 - 0) = 0rightmoves to 1.
- Move
-
Step 2:
rightat 1.nums[right]is 0, sozeroCountincrements to 1.- Current window:
[1, 0] maxLen = max(0, 1 - 0) = 1rightmoves to 2.
-
Step 3:
rightat 2.nums[right]is 1, sozeroCountremains 1.- Current window:
[1, 0, 1] maxLen = max(1, 2 - 0) = 2rightmoves to 3.
-
Step 4:
rightat 3.nums[right]is 1, sozeroCountremains 1.- Current window:
[1, 0, 1, 1] maxLen = max(2, 3 - 0) = 3rightmoves to 4.
-
Step 5:
rightat 4.nums[right]is 0, sozeroCountincrements to 2.- Since
zeroCount> 1, adjustleft.nums[left]is 1, sozeroCountremains 2.leftmoves to 1.nums[left]is 0, sozeroCountdecrements to 1.leftmoves to 2.
- Current window:
[1, 1, 0, 1] maxLen = max(3, 4 - 2) = 3rightmoves to 5.
-
Step 6:
rightat 5.nums[right]is 1, sozeroCountremains 1.- Current window:
[1, 1, 0, 1] maxLen = max(3, 5 - 2) = 3rightmoves to 6 (end of array).
-
Final State:
- The maximum length of a subarray containing only 1s after removing one element is
3.
- The maximum length of a subarray containing only 1s after removing one element is
Code
class Solution {
public int longestSubarray(int[] nums) {
int left = 0, right = 0, zeroCount = 0, maxLen = 0;
// Iterate through the array with right pointer
while (right < nums.length) {
if (nums[right] == 0) zeroCount++;
// If more than one zero in the window, adjust left pointer
while (zeroCount > 1) {
if (nums[left] == 0) zeroCount--;
left++;
}
// Update max length
maxLen = Math.max(maxLen, right - left);
right++;
}
return maxLen;
}
public static void main(String[] args) {
Solution sol = new Solution();
System.out.println(sol.longestSubarray(new int[] { 1, 1, 0, 0, 1, 1 })); // Output: 2
System.out.println(sol.longestSubarray(new int[] { 1, 1, 0, 1, 1, 1 })); // Output: 5
System.out.println(sol.longestSubarray(new int[] { 1, 0, 1, 1, 0, 1 })); // Output: 3
}
}
Complexity Analysis
Time Complexity
The time complexity of the solution is n is the length of the input array nums. This is because we iterate through the array only once with the right pointer, and the left pointer also moves at most n times. Each element is processed a constant number of times, resulting in linear time complexity.
Space Complexity
The space complexity of the solution is
🤖 Don't fully get this? Learn it with Claude
Stuck on Longest Subarray of 1's After Deleting One Element? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.
Progressively stronger hints — you still solve it.
I'm working on the problem **Longest Subarray of 1's After Deleting One Element** (DSA). Give me a HINT LADDER: start with the tiniest nudge, then wait. Only reveal the next, stronger hint when I ask. Do NOT show the full solution unless I type 'show solution'. Keep me doing the thinking. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
See the technique, not just code.
Explain the optimal approach to **Longest Subarray of 1's After Deleting One Element** with a VISUAL walkthrough: trace it on a small concrete example using ASCII art / a step-by-step diagram, narrate what changes each step, then give time & space complexity with a one-line derivation. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Catch bugs, edge cases, sub-optimality.
I'll paste my solution to **Longest Subarray of 1's After Deleting One Element**. Review it for correctness, missed edge cases, and time/space complexity, then coach me toward the optimal — don't just rewrite it. Ask me to paste my code now. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Lock in recognition with look-alikes.
Give me 2 problems that use the SAME underlying pattern as **Longest Subarray of 1's After Deleting One Element**. For each, let me attempt first, then review my answer and name the trigger signal that reveals the pattern. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.