考虑使用贪心算法。
(1)设f0(i)为以i为结尾的连续元素为1的最长子数组长度。
(2)设f1(i)为以i为结尾的,删除1个元素为0之后的,连续元素为1的最长子数组长度。
注意:这里有一个特殊情况,当整个元素均为1时,需要单独处理。
(3)若max等于数组长度,对计算的max长度减一。
public int longestSubarray(int[] nums) {
int max = 0;
int p0 = 0, p1 = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 0) {
max = Math.max(max, p1);
p1 = p0;
p0 = 0;
}else {
p0++;
p1++;
}
}
max = Math.max(max, p1);
if (max == nums.length) {
max--;
}
return max;
}