Longest Subarray Deleting Element

// https://leetcode.com/problems/longest-subarray-of-1s-after-deleting-one-element

/*
Given a binary array nums, you should delete one element from it.
Return the size of the longest non-empty subarray containing only 1's in the resulting array. 
Return 0 if there is no such subarray.

Ex1:
Input: nums = [1,1,0,1]
Output: 3
Explanation: After deleting the number in position 2, [1,1,1] contains 3 numbers with value of 1's.

Ex2:
Input: nums = [0,1,1,1,0,1,1,0,1]
Output: 5
Explanation: After deleting the number in position 4, [0,1,1,1,1,1,0,1] longest subarray with value of 1's is [1,1,1,1,1].

Ex3:
Input: nums = [1,1,1]
Output: 2
Explanation: You must delete one element.

*/

#include <vector>
#include <cassert>

using namespace std;

// Time complexity: O(N), Space complexity: O(1)
int longestSubarray(vector<int>& nums) {
    if (nums.empty()) {
        return 0;
    }

    int res = 0;
    int l = 0, r = 0;
    int n = nums.size();
    bool deleted = false;

    while (r < n) {
        if (nums[r] == 1) {
            r++;
        } else {
            if (deleted) {
                if (nums[l] == 0) {
                    deleted = false;
                }
                l++;
            } else {
                deleted = true;
                r++;
            }
        }

        res = max(res, r-l-1); // -1 is for the deleted element
    }

    return res;
}

int main() {
    vector<int> nums1 = {1,1,0,1};
    assert(longestSubarray(nums1) == 3);

    vector<int> nums2 = {0,1,1,1,0,1,1,0,1};
    assert(longestSubarray(nums2) == 5);

    vector<int> nums3 = {1,1,1};
    assert(longestSubarray(nums3) == 2);

    return 0;
}```

Last updated