DSSW:MAX

这里记录不定长滑窗:最长/最大值题单题解。

1. LC 1493 删除一个元素以后全为1的最长子数组

因为删且仅删一个元素,所以可以直接用一个标记位来记录这个删除的索引。

首先我们要肯定的一点是,除非整个数组都是1,不然肯定不删1的,删0的效果等于或优于删1,所以碰到1我们直接给长度+1就行。

  1. 如果当前元素是0
    1. 如果这个索引合法(例如≠-1),那么说明之前删过了,我们就得把之前删除的位置前面的所有1全部舍弃(舍弃过程中维护最大值),然后从上一次删除的位置后面一个位置开始算起,并更新当前位置是删除位置
    2. 如果这个索引不合法,说明压根没删过,那么把这个当前的位置记录为删除的位置,然后继续即可。
  2. 如果当前元素为1,那么直接长度+1,过。原因上面说了。

最后,这个题是必须删一个的,所以如果最后长度等于数组长度的话,就等于没删,需要删一个。

class Solution {
    public int longestSubarray(int[] nums) {
        int n = nums.length;
        if(n==1){
            return 0;
        }
        int rp = 0;
        int cur = 0;
        int ans = 0;
        int lz = -1;
        while(rp<n){
            if(nums[rp]==1){
                cur++;
            }else{
                if(lz!=-1){
                    ans = Math.max(ans,cur);
                    cur = rp-lz-1;
                }
                lz = rp;
            }
            rp++;
            ans = Math.max(cur,ans);
        }
        return ans==n?n-1:ans;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值