You are allowed to replace at most one element in the array with any other integer value of your choice.
Return the length of the longest non-decreasing subarray that can be obtained after performing at most one replacement.
An array is said to be non-decreasing if each element is greater than or equal to its previous one (if it exists).
Example 1:
Input:nums = [1,2,3,1,2]
Output:4
Explanation:
Replacing nums[3] = 1 with 3 gives the array [1, 2, 3, 3, 2].
The longest non-decreasing subarray is [1, 2, 3, 3], which has a length of 4.
Example 2:
Input:nums = [2,2,2,2,2]
Output:5
Explanation:
All elements in nums are equal, so it is already non-decreasing and the entire nums forms a subarray of length 5.
Constraints:
1 <= nums.length <= 105
-109 <= nums[i] <= 109βββββββ
Solutions
Solution 1: Prefix and Suffix Decomposition + Enumeration
We can use two arrays \(\textit{left}\) and \(\textit{right}\) to record the length of the longest non-decreasing subarray ending and starting at each position, respectively. Initially, \(\textit{left}[i] = 1\) and \(\textit{right}[i] = 1\).
Then, we traverse the array in the range \([1, n-1]\). If \(\textit{nums}[i] \geq \textit{nums}[i-1]\), we update \(\textit{left}[i]\) to \(\textit{left}[i-1] + 1\). Similarly, we traverse the array backwards in the range \([n-2, 0]\). If \(\textit{nums}[i] \leq \textit{nums}[i+1]\), we update \(\textit{right}[i]\) to \(\textit{right}[i+1] + 1\).
Next, we can compute the final answer by enumerating each position. For each position \(i\), we can calculate the length of the longest non-decreasing subarray centered at \(i\) in the following way:
If the elements on the left and right sides of \(i\) do not satisfy \(\textit{nums}[i-1] \leq \textit{nums}[i+1]\), we can only choose the non-decreasing subarray from either the left or right side, so the answer is \(\max(\textit{left}[i-1], \textit{right}[i+1]) + 1\).
Otherwise, we can replace position \(i\) with an appropriate value so that the non-decreasing subarrays on the left and right can be connected, so the answer is \(\textit{left}[i-1] + \textit{right}[i+1] + 1\).
Finally, we take the maximum value across all positions as the final answer.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\), where \(n\) is the length of the array.