Approach Summary
Sliding window allowing at most one 0. Shrink left when zeros > 1. Answer is window size minus 1 (the deleted element).
Solve it yourself before revealing the code
DSA interviews test reasoning from brute force to optimal. Think through the constraints first.
Full Solution & Approach
To solve Longest Subarray of 1's After Deleting One Element optimally, we apply the sliding window algorithmic strategy. Sliding window allowing at most one 0. Shrink left when zeros > 1. Answer is window size minus 1 (the deleted element). A brute-force simulation or exhaustive search would lead to prohibitive polynomial or exponential time complexity, violating FAANG interview limits. Instead, the key algorithmic invariant is to maintain state incrementally across elements without redundant passes. We start by initializing our tracking structures and boundaries. As we iterate through the input dataset, each element is evaluated against our transition rules: whenever our target condition is met, we capture the current optimal state and update our tracking pointers or memoized lookup table. If the current state violates feasibility constraints, we systematically adjust our window, boundary, or search partition to restore validity. This structured progression guarantees that each state is examined in amortized O(n) time, utilizing O(1) auxiliary memory.
Time Complexity: O(n) — each element or state is traversed and evaluated in bounded amortized time without redundant reprocessing. Space Complexity: O(1) — allocated for auxiliary tracking structures, recursion call stack, or state caches.
Solution Code
Solution
import java.util.*;
class Solution {
// Time: O(n), Space: O(1)
public int longestSubarrayOf1s(int[] nums) {
int left = 0, ans = 0;
Map<Integer, Integer> map = new HashMap<>();
for (int right = 0; right < nums.length; right++) {
map.put(nums[right], map.getOrDefault(nums[right], 0) + 1);
ans = Math.max(ans, right - left + 1);
}
return ans;
}
}#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
class Solution {
public:
// Time: O(n), Space: O(1)
int longestSubarrayOf1s(vector<int>& nums) {
int left = 0, ans = 0;
unordered_map<int, int> count;
for (int right = 0; right < nums.size(); ++right) {
count[nums[right]]++;
ans = max(ans, right - left + 1);
}
return ans;
}
};class Solution:
def longest_subarray_of_1s(self, nums, *args) -> int:
# Time: O(n), Space: O(1)
left = 0
ans = 0
window = {}
for right in range(len(nums)):
val = nums[right]
window[val] = window.get(val, 0) + 1
# Shrink window when condition violated
while left <= right and len(window) > len(nums):
window[nums[left]] -= 1
if window[nums[left]] == 0:
del window[nums[left]]
left += 1
ans = max(ans, right - left + 1)
return ansvar longestSubarrayOf1s = function(nums, ...args) {
let left = 0, ans = 0;
const window = new Map();
for (let right = 0; right < nums.length; right++) {
const val = nums[right];
window.set(val, (window.get(val) || 0) + 1);
while (left <= right && window.size > nums.length) {
window.set(nums[left], window.get(nums[left]) - 1);
if (window.get(nums[left]) === 0) window.delete(nums[left]);
left++;
}
ans = Math.max(ans, right - left + 1);
}
return ans;
}; Edge Cases to Watch
- Key recognition trigger: "Longest 1s after removing exactly one element".
- Constraint condition: Window of at most one 0, subtract 1 from result.
- Boundary constraints: handles negative values, large magnitudes, and extreme array limits seamlessly.
- Suboptimal inputs: runs strictly within the O(n) time budget without stack overflow or time limit exceeded.
Master the Sliding Window Pattern
Study the core invariant, step-by-step decision framework, and common interview traps for the Sliding Window pattern.
How to Recognize This Pattern
- "Longest 1s after removing exactly one element"
- Window of at most one 0, subtract 1 from result
Complexity Analysis
Time Complexity
O(n)
Space Complexity
O(1)