2025年- H109-Lc1493. 删掉一个元素以后全为 1 的最长子数组(双指针)--Java版

1.题目描述

2.思路

如果有元素之间有相对顺序关系的话,不建议使用hashmap

(1)不定长滑动窗口:

不定长滑动窗口主要分为三类:求最长子数组,求最短子数组,求子数组个数。

注:滑动窗口相当于在维护一个队列。右指针的移动可以视作入队,左指针的移动可以视作出队。

(2)删除后,子数组只有 1,也就是没有 0。那么删除之前呢?至多有一个 0。

(3)cnt = cnt - (1 - numsleft);

如果将要移出窗口的 numsleft 是 1,那么 1 - numsleft 的结果是 0。cnt 不变(因为移出一个1对0的个数没有影响)。

如果将要移出窗口的 numsleft 是 0,那么 1 - numsleft 的结果是 1。cnt 减少 1(因为我们把一个0移出了窗口)。

所以,这行代码的作用是:当窗口移出一个 0 时,cnt 减一。

(4)当右指针 right 移动,元素进入窗口时:

执行 cnt = cnt + 1 - numsright;

如果 numsright 是 1,那么 1 - numsright 的结果是 0。cnt 不变。

如果 numsright 是 0,那么 1 - numsright 的结果是 1。cnt 增加 1。

所以,这行代码的作用是:当窗口滑入一个 0 时,cnt 加一。

3.代码实现

java 复制代码
class Solution {
    public int longestSubarray(int[] nums) {
    //1.左右指针都从0开始移动
       int left=0;
       int cnt=0;//存0的个数
       int res=0;
       for(int right=0;right<nums.length;right++)
       { //1-nums[right]:从左往右遍历记录0的个数。因为遇到1的时候:1-1=0;遇到0的时候为1-0=1;实现计数功能
        //1.右指针进入窗口。当窗口滑入一个 0 时,cnt 加一。
        cnt=cnt+1-nums[right];
        while(cnt>1)//如果0的个数大于1,退出循环
        {
        //窗口末尾元素(最左边的元素)出队,nums[left]离开窗口
        //当窗口移出一个 0 时,cnt 减一。
        cnt=cnt-(1-nums[left]);
        left++;
        }
         // 3. 更新答案,注意不是 right-left+1,因为我们要删掉一个数
       res=Math.max(res,right-left);
       } 
       return res;
    }
}
相关推荐
lgcgkCQ18 分钟前
【AI 转型实战 1】SpringAI 入门:搭建基础大模型对话能力
java·ai·agent·rag·spring ai·mcp·langchain4j
Wang's Blog23 分钟前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友
学到老活到老30 分钟前
第 24 集:配置文件写了 80,Spring Boot 为什么读到 90?
java·后端·spring
tongyiixiaohuang1 小时前
供应商主数据同步实战:从易快报到金蝶云星空的单一策略落地
java·网络·数据库
鱼宵1 小时前
取集合第一个元素,Java 为什么要写三种写法?
java·windows·python·java21
学长毕设2 小时前
基于SpringBoot的餐厅管理系统-附源码
java·spring boot·后端
刚入门的大一新生2 小时前
Linux-线程互斥
java·开发语言
赵小哥要冲啦3 小时前
社区邻里互助小程序从 0 到 1 复盘:需求拆解与信任机制设计
java·小程序·需求分析
xiaogai_gai3 小时前
采购业务退款单同步实战:从钉钉审批流到金蝶云星空付款单
java·数据库·钉钉
二哈赛车手3 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript