leetcode1493
递归:
1.记pre[i]为以i位置结尾的连续1长度。
pre[i]=0;ai=0
pre[i]=pre[i-1]+1;ai=1
记suf[i]为以位置i开头的连续1长度;
suf[i]=0;ai=0
suf[i]=suf[i+1]+1;ai=1
计算删掉i位置的连续1的长度为pre[i-1]+suf[i+1],再枚举每个位置找出最大的数返回。
ans=max(pre[n-2],suf[1]);//为了防止数组溢出,删除数组的位置没有最后和开始的位置,在这里先计算比较。 for(int i=1;i<n-1;i++){//从1开始,n-2结束是为了防止数组溢出,删除1--2位置之后连续1的长度 ans=max(ans,pre[i-1]+suf[i+1]); }
2.记p0[i]为以位置i结尾的连续1的长度,
p0[i]=0;ai=0
p0[i]=p0[i-1]+1;ai=1
记p1[i]为i位置删除一个0之后连续1 的个数
p1[i]=p0[i-1];ai=0 //删除的是i位置的0
p1[i]=p1[i-1]+1;ai=1 //删除的不是i位置的0
最后计算p1的最大值返回
以上看出p1[i]的更新只与p0[i-1]和p1[i-1]有关
用一个变量记录p0[i-1]和p1[i-1]
for(int i=0;i<n;++i){ if(nums[i]==0){ p1=p0; p0=0; }else{ ++p1; ++p0; } ans=max(ans,p1);//每次比较一下p1 }
当全是1时需要特殊处理,因为全是1时必须要删除一位,所以当ans==n时要减1。