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。

posted @ 2023-05-20 20:05  iu本u  阅读(17)  评论(0)    收藏  举报