news 2026/5/20 12:20:57

两道经典算法吃透双指针与滑动窗口!接雨水 + 无重复最长子串超详细题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
两道经典算法吃透双指针与滑动窗口!接雨水 + 无重复最长子串超详细题解

在算法面试与刷题中,双指针、滑动窗口是高频核心考点,既能解决数组区间问题,也能高效处理字符串匹配场景。本文将精讲两道力扣经典题:42. 接雨水(双指针预处理优化)、3. 无重复字符的最长子串(滑动窗口经典应用),从思路推导到代码实现,带你彻底吃透这类题型。


一、42. 接雨水

题目链接

42. 接雨水 - 力扣(LeetCode)

核心思路

每一列能接到的雨水量,由左侧最高柱子右侧最高柱子中较小的那个决定:

当前列雨水量 = min (左侧柱子最大高度,右侧柱子最大高度) - 当前柱子高度

如果直接对每个位置分别向左右遍历找最大值,会存在大量重复计算,时间复杂度极高。因此我们采用预处理数组优化

  1. 正向遍历,用数组maxLeft记录每个位置左侧最高柱子高度
  2. 反向遍历,用数组maxRight记录每个位置右侧最高柱子高度
  3. 最后遍历一次数组,累加每一列的接水量即可

递推公式

  • 从左到右:maxLeft[i] = max(height[i], maxLeft[i - 1])
  • 从右到左:maxRight[i] = max(height[i], maxRight[i + 1])

代码实现

class Solution { public int trap(int[] height) { int length = height.length; // 柱子数≤2无法接水 if (length <= 2) { return 0; } int[] maxLeft = new int[length]; int[] maxRight = new int[length]; // 预处理左侧最大高度数组 maxLeft[0] = height[0]; for (int i = 1; i < length; i++) { maxLeft[i] = Math.max(height[i], maxLeft[i - 1]); } // 预处理右侧最大高度数组 maxRight[length - 1] = height[length - 1]; for (int j = length - 2; j >= 0; j--) { maxRight[j] = Math.max(height[j], maxRight[j + 1]); } // 计算总接水量 int sum = 0; for (int i = 0; i < length; i++) { int count = Math.min(maxLeft[i], maxRight[i]) - height[i]; sum += count; } return sum; } }

二、3. 无重复字符的最长子串

题目链接

3. 无重复字符的最长子串 - 力扣(LeetCode)

核心思路

本题是滑动窗口的典型例题:把窗口看作字符串中一段无重复字符的区间[left, right]

  1. right指针向右扩展,尝试将新字符加入窗口
  2. 若当前字符已在窗口内重复,将left右移,收缩窗口直至无重复
  3. 每次窗口合法时,更新最长子串长度

使用哈希表记录字符最近一次出现的索引,可快速判断重复并定位窗口左边界。

代码实现

class Solution { public int lengthOfLongestSubstring(String s) { // 记录字符及其最近一次出现的下标 HashMap<Character, Integer> map = new HashMap<>(); int left = 0; int maxLength = 0; for (int right = 0; right < s.length(); right++) { char c = s.charAt(right); // 字符重复且在当前窗口内,移动左边界 if (map.containsKey(c) && map.get(c) >= left) { left = map.get(c) + 1; } // 更新当前字符最新位置 map.put(c, right); // 更新最大长度 maxLength = Math.max(maxLength, right - left + 1); } return maxLength; } }

总结

  1. 接雨水:通过预处理左右最大高度,避免重复遍历,以空间换时间,高效计算总雨水量
  2. 无重复最长子串:滑动窗口 + 哈希表快速去重,线性时间复杂度解决字符串区间问题
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 0:36:09

万象视界灵坛实操案例:博物馆数字藏品图像‘青铜器’‘唐三彩’‘水墨画’三级语义识别

万象视界灵坛实操案例&#xff1a;博物馆数字藏品图像青铜器唐三彩水墨画三级语义识别 1. 项目背景与价值 在博物馆数字化进程中&#xff0c;如何准确识别和分类各类文物图像是一个重要课题。传统基于标签的分类系统往往难以捕捉文物深层的艺术风格和文化内涵。 万象视界灵坛…

作者头像 李华
网站建设 2026/4/2 0:36:08

嵌入式Linux内核编译实战技巧与优化指南

1. 嵌入式Linux内核编译实战指南作为一名在嵌入式领域摸爬滚打多年的老鸟&#xff0c;我深知内核编译这个看似简单的操作里藏着多少坑。记得刚入行时&#xff0c;一个简单的ARCH参数设置错误就让我折腾了整整两天。今天就把这些年在ARM平台编译内核积累的实战经验整理成文&…

作者头像 李华
网站建设 2026/4/2 0:35:05

SEED数据集之外:脑电情感识别还有哪些开源数据集值得一试?

SEED数据集之外&#xff1a;脑电情感识别领域五大开源数据集深度评测 当我在实验室第一次尝试构建情感识别模型时&#xff0c;和大多数初学者一样&#xff0c;首先接触到的就是SEED数据集。但随着研究的深入&#xff0c;我逐渐发现这个领域远比想象中丰富——不同诱发范式、采集…

作者头像 李华
网站建设 2026/4/4 7:21:43

小米智能家居跨区域协同控制技术指南

小米智能家居跨区域协同控制技术指南 【免费下载链接】ha_xiaomi_home Xiaomi Home Integration for Home Assistant 项目地址: https://gitcode.com/GitHub_Trending/ha/ha_xiaomi_home 随着智能家居设备数量的快速增长&#xff0c;多区域设备协同工作已成为提升居住体…

作者头像 李华
网站建设 2026/4/4 22:16:13

016、机器学习基础:模型、训练与评估方法论

从一次调试说起 帮同事看一个图像分类项目&#xff0c;测试集准确率卡在 92% 死活上不去。他反复调整网络层数、换优化器、甚至试了数据增强&#xff0c;效果都不明显。最后我让他把训练集和验证集的 loss 曲线打出来——两条线早早就分道扬镳&#xff0c;验证集 loss 从第 5 个…

作者头像 李华