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

实用指南:【LeetCode精选算法】滑动窗口专题一

目录

9. 长度最小的子数组(209. Minimum Size Subarray Sum)

10. 无重复字符的最长子串(3. Longest Substring Without Repeating Characters)

11. 最大连续1的个数 III(1004. Max Consecutive Ones III)

12. 将x减到0的最小操作数(1658. Minimum Operations to Reduce X to Zero)


1. 长度最小的子数组(209. Minimum Size Subarray Sum)

题目链接LeetCode 209

详细解题思路

  1. 核心思想:滑动窗口(同向双指针)

  2. 具体步骤

  3. 时间复杂度:O(n),每个元素最多被访问两次

  4. 空间复杂度:O(1)

class Solution {public int minSubArrayLen(int target, int[] nums) {int left = 0, right = 0;int sum = 0;int minLength = Integer.MAX_VALUE;while (right < nums.length) {// 扩展窗口:右指针右移sum += nums[right];// 收缩窗口:当窗口和≥target时,尝试缩小窗口while (sum >= target) {// 更新最小长度minLength = Math.min(minLength, right - left + 1);// 收缩窗口:左指针右移sum -= nums[left];left++;}// 继续扩展窗口right++;}// 如果没找到符合条件的子数组,返回0return minLength == Integer.MAX_VALUE ? 0 : minLength;}
}

2. 无重复字符的最长子串(3. Longest Substring Without Repeating Characters)

题目链接:LeetCode 3

详细解题思路

  1. 核心思想:滑动窗口 + 哈希表记录字符出现次数

  2. 具体步骤

    • 初始化left=0, right=0,哈希数组hash[128]

    • 右指针right向右扩展,对应字符计数加1

    • 当某个字符计数>1时,说明出现重复:

      • 左指针left向右移动,直到重复字符的计数降为1

      • 同时更新哈希表

    • 每次循环更新最大长度

  3. 优化:可以用哈希表记录字符最后出现的位置,直接跳转到重复字符的下一位

  4. 时间复杂度:O(n),空间复杂度:O(字符集大小)

class Solution {public int lengthOfLongestSubstring(String s) {// 哈希表,记录每个字符出现的次数int[] hash = new int[128];int left = 0, right = 0;int maxLength = 0;while (right < s.length()) {// 右指针字符进入窗口char inChar = s.charAt(right);hash[inChar]++;// 如果当前字符出现次数>1,说明有重复while (hash[inChar] > 1) {// 左指针字符移出窗口char outChar = s.charAt(left);hash[outChar]--;left++;}// 更新最大长度maxLength = Math.max(maxLength, right - left + 1);// 右指针右移right++;}return maxLength;}
}

3. 最大连续1的个数 III(1004. Max Consecutive Ones III)

题目链接:LeetCode 1004

详细解题思路

  1. 核心思想:滑动窗口,维护窗口内0的个数≤k

  2. 问题转化:求最长子数组,其中0的个数不超过k

  3. 具体步骤

    • 初始化left=0, right=0, zeroCount=0

    • 右指针right扩展窗口:

      • 如果nums[right]==0zeroCount++

    • zeroCount > k时,收缩窗口:

      • 如果nums[left]==0zeroCount--

      • left++

    • 更新最大窗口长度

  4. 时间复杂度:O(n),空间复杂度:O(1)

class Solution {public int longestOnes(int[] nums, int k) {int left = 0, right = 0;int zeroCount = 0;  // 窗口内0的个数int maxLength = 0;while (right < nums.length) {// 右指针扩展窗口if (nums[right] == 0) {zeroCount++;}// 如果0的个数超过k,收缩窗口while (zeroCount > k) {if (nums[left] == 0) {zeroCount--;}left++;}// 更新最大长度maxLength = Math.max(maxLength, right - left + 1);// 右指针右移right++;}return maxLength;}
}

4. 将x减到0的最小操作数(1658. Minimum Operations to Reduce X to Zero)

题目链接:LeetCode 1658

详细解题思路

  1. 核心思想:问题转化 + 滑动窗口

  2. 问题转化

    • 移除数组两端元素,使和为x

    • 等价于:找到数组中间最长的子数组,使其和为sum - x

    • 最小操作数 = n - 最长子数组长度

  3. 具体步骤

    • 计算数组总和totalSum

    • 目标子数组和target = totalSum - x

    • 如果target < 0,直接返回-1

    • 使用滑动窗口找到和为target的最长子数组

  4. 边界情况

    • 如果target == 0,需要移除整个数组

    • 如果找不到和为target的子数组,返回-1

  5. 时间复杂度:O(n),空间复杂度:O(1)

class Solution {public int minOperations(int[] nums, int x) {int totalSum = 0;for (int num : nums) {totalSum += num;}int target = totalSum - x;// 如果目标值小于0,不可能实现if (target < 0) return -1;// 如果目标值等于0,需要移除所有元素if (target == 0) return nums.length;int left = 0, right = 0;int currentSum = 0;int maxSubarrayLength = -1;while (right < nums.length) {// 扩展窗口currentSum += nums[right];// 收缩窗口:如果当前和大于目标值while (currentSum > target && left <= right) {currentSum -= nums[left];left++;}// 如果找到目标子数组,更新最大长度if (currentSum == target) {maxSubarrayLength = Math.max(maxSubarrayLength, right - left + 1);}// 右指针右移right++;}// 如果没找到符合条件的子数组if (maxSubarrayLength == -1) return -1;// 最小操作数 = 总长度 - 最长子数组长度return nums.length - maxSubarrayLength;}
}

http://www.jsqmd.com/news/384453/

相关文章:

  • 2026年比较好的香港工业级热风枪/香港维修热风枪全方位厂家推荐参考 - 品牌宣传支持者
  • 2026年口碑好的折弯机液压夹具/折弯机液压上夹具高评分品牌推荐(畅销) - 品牌宣传支持者
  • 【雷达原理学习笔记 魏青】49. 雷达作用距离(六)
  • 17:【Python】pip install失败 SSL证书错误 / HTTPSConnectionPool(证书链问题)
  • 计算机毕业设计:我劝你别选“管理系统“
  • 2026年2月口碑良好的大件运输厂家推荐来啦,大件运输/大件物流,大件运输厂家口碑推荐 - 品牌推荐师
  • 19:【2026推荐】uv venv创建 激活 比conda/pip快10倍用法
  • 2025精小型调节阀大品牌供货商排名,气动高温调节阀/自力式调节阀/特种调节阀/气动三通调节阀/高性能调节阀/电动调节阀调节阀工厂哪家权威 - 品牌推荐师
  • 20:【Python】VS Code / Cursor / PyCharm解释器不识别 / 插件崩溃
  • 2026年靠谱的苏州GEO投放/苏州GEO流量项目实践推荐企业 - 品牌宣传支持者
  • 2026年比较好的火花机/镜面火花机品牌厂家推荐 - 品牌宣传支持者
  • 万里通积分卡线上回收怎么样?推荐优质平台与常见问题答案 - 团团收购物卡回收
  • 18:【新手最崩溃】ModuleNotFoundError: No module named ‘xxx‘ 终极排查(venv/uv venv没激活)
  • 神经网络到底是什么?——6000 万个旋钮的真相
  • SpringBoot整合kaptcha实现验证码功能
  • 2026年知名的智能系统门窗/金属门窗厂家推荐与选购指南 - 品牌宣传支持者
  • 城南核心现房交付实景,2026年置业优选指南,新楼盘/南都新城/新房/70年产权住宅/婚房/现房/婚房,现房机构有哪些 - 品牌推荐师
  • 2026年知名的湿电子化学品/电镀液电子化学品厂家实力参考 - 品牌宣传支持者
  • 【RT-DETR涨点改进】全网独家复现、特征融合改进篇| CVPR 2025| 引入MEPF掩膜增强像素级融合模块,高效融合浅层特征与深层特征,含多种创新,助力遥感小目标检测、图像分割、分类,高效涨点
  • 2026年比较好的空间钢结构/大型车间钢结构行业内口碑厂家推荐 - 品牌宣传支持者
  • 零基础学AI大模型之LLM存储优化:大量QA与长对话问题实战深度解析:原理、实战与踩坑记录
  • 2026年比较好的精密仪器基座/foundation基座优质厂家推荐汇总 - 品牌宣传支持者
  • 2026年口碑好的主动防微振平台/高精度防微振平台厂家选择参考建议 - 品牌宣传支持者
  • 2026最新!降AI率工具 千笔·降AIGC助手 VS 知文AI,继续教育专属利器
  • 2026年质量好的零食烤虾/年货烤虾高评分品牌推荐(畅销) - 品牌宣传支持者
  • 在AI技术唾手可得的时代,挖掘用户真正想要的需求才是关键——一款App Store热门榜单顶部导航组件的用户呼声分析
  • UVA1389 Hard Life
  • AI工具泛滥?给你一个清晰的学习优先级排序
  • 《实时渲染》第3章-图形处理单元-3.5顶点着色器
  • 2026年市面上专业的升降机公司排名,自行走升降机/装卸平台/防爆升降平台/液压升降机/装车平台,升降机工厂如何选 - 品牌推荐师