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.
Example 4:
Input: nums = [1,1,0,0,1,1,1,0,1]
Output: 4
Example 5:
Input: nums = [0,0,0]
Output: 0
Constraints:
- 1 <= nums.length <= 10^5
- nums[i] is either 0 or 1.
状态机, 没别的可说的了, 全在代码里了
impl Solution {
pub fn longest_subarray(nums: Vec<i32>) -> i32 {
let mut prev_count = 0;
let mut curr_count = 0;
let mut is_prev_zero = false;
let mut removed = false;
let mut ans = 0;
for n in nums {
if n == 1 {
curr_count += 1;
is_prev_zero = false;
ans = ans.max(prev_count + curr_count);
} else {
if is_prev_zero {
ans = ans.max(prev_count);
prev_count = 0;
} else {
is_prev_zero = true;
prev_count = curr_count;
curr_count = 0;
}
removed = true;
}
}
ans = ans.max(prev_count + curr_count);
if removed {
ans
} else {
ans - 1
}
}
}