当前位置: 首页 > backend >正文

[滑动窗口]1493. 删掉一个元素以后全为 1 的最长子数组

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

1493. 删掉一个元素以后全为 1 的最长子数组 - 力扣(LeetCode)

给定一个二进制数组nums,你需要从中删除一个元素(必须删除一个,且只能删除一个),返回最长的且只包含1的非空子数组的长度。如果不存在这样的子数组,返回0。

注意:删除一个元素后,剩下的元素需要是连续的(因为是子数组)。实际上,问题可以转化为:在数组中找一个子数组,这个子数组最多只能包含一个0,然后这个子数组的长度减1(因为我们要删除一个元素)就是候选答案。但是注意,如果整个数组都是1,那么删除一个元素后,长度是原长度减1。

注意:如果整个数组都是1,那么删除一个1后,剩下的连续1的长度是n-1,而按照上述方法,我们找到的子数组(整个数组)长度为n,减去1后是n-1,符合要求。

所以算法:使用滑动窗口,维护一个窗口,窗口内最多只能有一个0。当窗口内0的个数超过1时,移动左指针。然后记录窗口大小减1的最大值。

方法思路

  1. 1.​问题分析​:题目要求从二进制数组中删除一个元素后,找到最长的连续1子数组。关键在于理解删除一个元素相当于允许窗口中最多有一个0,因为删除0可以连接两段1,而删除1则减少连续1的长度。
  2. 2.直觉​:使用滑动窗口维护一个最多包含一个0的子数组。窗口的扩展由右指针控制,当窗口内0的个数超过1时,左指针移动以调整窗口。
  3. 3.​算法选择​:滑动窗口算法高效地遍历数组,动态调整窗口大小,确保窗口内最多只有一个0。时间复杂度为O(n),空间复杂度为O(1)。
  4. 4.​复杂度分析​:每个元素最多被访问两次(左指针和右指针各一次),因此时间复杂度为线性。仅使用几个变量,空间复杂度为常数。

解决代码

class Solution:def longestSubarray(self, nums: List[int]) -> int:ans = 0cnt0 = 0left = 0n = len(nums)for right in range(n):cnt0 += 1 - nums[right]while cnt0 > 1:cnt0 -= 1 - nums[left]left += 1ans = max(ans, right - left)return ans

代码解释

  1. 1.​初始化​:ans存储最大长度,cnt0计数窗口中的0的个数,left表示窗口左边界。
  2. 2.​滑动窗口​:右指针right遍历数组,更新cnt0。当cnt0超过1时,移动左指针left并调整cnt0
  3. 3.​更新结果​:每次迭代计算当前窗口长度(right - left)并更新ans
  4. 4.​返回结果​:遍历结束后返回ans,即最长连续1子数组的长度(删除一个元素后)。

该方法确保在线性时间内高效解决问题,适用于大规模数据输入。

http://www.xdnf.cn/news/18612.html

相关文章:

  • 今天学习计算机网格技术的TCP,UDP以及OSPF
  • 【AI智能体】Dify 搭建业务单据差异核对助手实战详解
  • 【Spring Cloud 微服务】3.智能路由器——深入理解与配置负载均衡
  • 【数据结构】从基础到实战:全面解析归并排序与计数排序
  • 在 Docker 容器中查看 Python 版本
  • SpringBoot的学生学习笔记共享系统设计与实现
  • SO_REUSEADDR
  • 计算机视觉与自然语言处理技术体系概述
  • Python内置函数全解析:30个核心函数语法、案例与最佳实践指南
  • Shell脚本-expect
  • Linux 软件编程(十)网络编程:网络协议,UDP 与 TCP 知识点
  • 计算机网络基础(三) --- TCP/IP网络结构(运输层)
  • golang3变量常量
  • Shell脚本-影响shell程序的内置命令
  • MATLAB 在工程仿真中的实践:以机械振动分析为例的完整流程
  • STM32 入门实录:macOS 下从 0 到点亮 LED
  • Java 编译器的世界:前端、JIT 与 AOT 的秘密:详解 Java 的编译过程与编译器生态
  • QT面试题总结(持续更新)
  • Excel 表格 - 合并单元格、清除单元格格式
  • kubernetes中的认证和授权
  • 小程序全局状态管理:使用MobX进行跨组件数据共享详解(九)
  • 国内使用SSH稳定使用github
  • 分布式账本:当不可篡改性遭遇法律拷问
  • ​Mac用户安装JDK 22完整流程(Intel版dmg文件安装指南附安装包下载)​
  • 【链表 - LeetCode】206. 反转链表【带ACM调试】
  • [身份验证脚手架] 前端认证与个人资料界面
  • 商密保护迷思:经营秘密到底需不需要鉴定?
  • 高并发内存池(1)-定长内存池
  • 通过python程序将实时监测数据写入excel软件进行保存是常用和非常实用的功能,本文教会大家怎么去搞定此功能
  • 塔能科技物联精准节能如何构建智慧路灯免疫系统