LeetCode 1493. Longest Subarray of 1's After Deleting One Element Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
1493. Longest Subarray of 1's After Deleting One Element

Description

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.

 

Example 1:

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.

Example 2:

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].

Example 3:

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

 

Constraints:

  • 1 <= nums.length <= 105
  • nums[i] is either 0 or 1.

Solutions

Solution 1: Enumeration

We can enumerate each position i to be deleted, then calculate the number of consecutive 1s on the left and right, and finally take the maximum value.

Specifically, we use two arrays left and right of length n+1, where left[i] represents the number of consecutive 1s ending with nums[i-1], and right[i] represents the number of consecutive 1s starting with nums[i].

The final answer is max_{0 ≤ i < n} {left[i] + right[i+1]}.

The time complexity is O(n), and the space complexity is O(n). Where n is the length of the array nums.

PythonJavaC++GoTypeScriptRust
class Solution: def longestSubarray(self, nums: List[int]) -> int: n = len(nums) left = [0] * (n + 1) right = [0] * (n + 1) for i, x in enumerate(nums, 1): if x: left[i] = left[i - 1] + 1 for i in range(n - 1, -1, -1): if nums[i]: right[i] = right[i + 1] + 1 return max(left[i] + right[i + 1] for i in range(n))(code-box)

Solution 2: Two Pointers

The problem is actually asking us to find the longest subarray that contains at most one 0. The remaining length after deleting one element from this subarray is the answer.

Therefore, we can use two pointers j and i to point to the left and right boundaries of the subarray, initially j = 0, i = 0. In addition, we use a variable cnt to record the number of 0s in the subarray.

Next, we move the right pointer i. If nums[i] = 0, then cnt is incremented by 1. When cnt > 1, we need to move the left pointer j until cnt ≤ 1. Then, we update the answer, i.e., ans = max(ans, i - j). Continue to move the right pointer i until i reaches the end of the array.

The time complexity is O(n), where n is the length of the array nums. The space complexity is O(1).

PythonJavaC++GoTypeScriptRust
class Solution: def longestSubarray(self, nums: List[int]) -> int: ans = 0 cnt = j = 0 for i, x in enumerate(nums): cnt += x ^ 1 while cnt > 1: cnt -= nums[j] ^ 1 j += 1 ans = max(ans, i - j) return ans(code-box)

Solution 3: Two Pointers (Optimization)

In Solution 2, we move the left pointer in a loop until cnt ≤ 1. Since the problem asks for the longest subarray, it means we don't need to reduce the length of the subarray. Therefore, if cnt \gt 1, we only move the left pointer once, and the right pointer continues to move to the right. This ensures that the length of the subarray does not decrease.

Finally, the answer we return is n - l - 1, where l is the position of the left pointer.

The time complexity is O(n), where n is the length of the array nums. The space complexity is O(1).

PythonJavaC++GoTypeScriptRust
class Solution: def longestSubarray(self, nums: List[int]) -> int: cnt = l = 0 for x in nums: cnt += x ^ 1 if cnt > 1: cnt -= nums[l] ^ 1 l += 1 return len(nums) - l - 1(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !