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

哈希表、双指针、滑动窗口、栈、BFS | :原理 + 解决什么问题 + 怎么实现 + 应用场景

一、哈希表(Hash Table / Python 里叫 dict /set)

1. 原理(超级通俗)

哈希表 =字典你给一个key(关键词),它能瞬间找到 value。它内部用哈希函数把 key 转成一个地址,所以查找极快

2. 它解决什么问题?

  • 快速判断一个元素是否存在
  • 快速统计次数
  • 快速做映射关系
  • 去重

时间复杂度:O(1)秒杀数组遍历 O (n)

3. 怎么实现?(Python)

python

运行

# 1. 字典 dict:存 key-value d = {} d["a"] = 1 # 添加 print(d["a"]) # 查询 if "a" in d: # 判断存在 # 2. 集合 set:只存 key,用于去重 s = set() s.add(1) if 1 in s:

4. 应用场景

  • 两数之和
  • 数组去重
  • 词频统计
  • 判断重复元素

二、双指针(Two Pointers)

1. 原理

两个变量当作指针,在数组 / 字符串上一起移动,代替多层循环。

两种最常用:

  1. 左右指针:一头一尾向中间走
  2. 快慢指针:一个走得快,一个走得慢

2. 解决什么问题?

O (n²) 暴力循环 → O (n)极大优化速度!

3. 怎么实现?

① 左右指针(有序数组两数之和)

python

运行

left = 0 right = len(nums) - 1 while left < right: if 满足条件: left += 1 else: right -= 1

② 快慢指针(删除重复元素)

python

运行

slow = 0 for fast in range(len(nums)): if nums[slow] != nums[fast]: slow += 1 nums[slow] = nums[fast]

4. 应用场景

  • 有序数组两数之和
  • 数组去重
  • 回文字符串
  • 链表找中点

三、滑动窗口(Sliding Window)

1. 原理

双指针的升级版。用left 和 right 维护一个区间(窗口)right 不断往右扩大left 遇到不满足条件就往右缩

一根尺子在数组上滑动,动态找最优区间。

2. 解决什么问题?

解决连续子数组 / 连续子串问题:

  • 最长无重复子串
  • 最短子数组
  • 子数组和
  • 连续活跃天数

3. 怎么实现?(万能模板)

python

运行

left = 0 for right in range(len(s)): 把 s[right] 加入窗口 while 窗口不合法: 移除 s[left] left += 1 更新最优答案

4. 应用场景

  • 最长无重复子串
  • 子数组和 ≥ target
  • 连续用户活跃天数
  • 流量统计、时间窗口指标

四、栈(Stack)

1. 原理

后进先出像:桶、弹匣、书堆最后放进去的,最先拿出来

2. 解决什么问题?

  • 括号匹配
  • 逆序输出
  • 找最近比大小的元素(单调栈)
  • 递归逻辑

3. 怎么实现?

python

运行

stack = [] stack.append(x) # 入栈 stack.pop() # 出栈 stack[-1] # 看栈顶

4. 应用场景

  • 有效括号
  • 字符串去重
  • 函数调用栈
  • 每日温度

五、BFS 广度优先搜索

1. 原理

一圈一圈往外扩散从起点开始,先遍历近的,再遍历远的用队列(queue)实现

2. 解决什么问题?

  • 最短路径
  • 图遍历
  • 网格搜索(岛屿、连通块)
  • 层级遍历

3. 怎么实现?

python

运行

from collections import deque q = deque() q.append(start) while q: 取出队首 把上下左右合法的点加入队列

4. 应用场景

  • 岛屿数量
  • 迷宫最短路径
  • 层级遍历
  • 社交网络关系距离

我再给你一句超级总结(面试必背)

  • 哈希表:快速查找、去重、统计
  • 双指针:用两个下标优化循环
  • 滑动窗口:动态区间,解决连续子串问题
  • :后进先出,适合匹配、逆序
  • BFS:一圈圈扩散,找最短路径、连通块
http://www.jsqmd.com/news/717299/

相关文章:

  • 基于微信小程序实现四六级词汇管理系统【附项目源码+论文说明】计算机毕业设计
  • Arm PFDI 1.0平台故障检测接口解析与应用
  • 工业级AI计算模块MTH968:边缘计算与自动化应用解析
  • 如何贡献react-swipeable:开源项目维护和代码提交指南
  • uniapp自定义进度条(vue或原生开发修改html标签即可)
  • 2025届毕业生推荐的十大AI写作网站实测分析
  • VS Code MCP协议集成实战(MCP v0.8.2深度适配手册)
  • Real Anime Z镜像安全机制:本地权重校验、SHA256签名验证与沙箱运行
  • 多维度拆透渲染引擎 第七篇【维度:生态】图形库、中间件与数据标准在渲染引擎中的角色
  • vue-beauty自定义组件开发教程:扩展你的组件库
  • 【OpenClaw最新版本】 命令行备忘录:高频操作与实战技巧
  • 2025_NIPS_Rethinking Memory and Communication Costs for Efficient Data Parallel Training of Large...
  • bge-large-zh-v1.5惊艳效果:中文学术摘要嵌入可视化与聚类图谱
  • 告别DQ线混战!手把手解析NAND SCA接口如何用CA通道提升SSD性能
  • 第4课:注意力机制入门【什么是“注意力”?】
  • NVIDIA NIM微服务:RTX AI PC上的生成式AI开发新范式
  • intv_ai_mk11惊艳案例:用intv_ai_mk11生成的5条工作效率建议被团队直接采用
  • 如何用Memtest86+彻底诊断电脑内存故障:新手完整指南
  • 告别电弧火花!用Arduino+过零检测模块实现交流电机软启动与调光
  • CST FAQ 008:CST-历史树
  • 【权威实测】Docker Compose vs. Dockerfile vs. Devcontainer.json:哪种远程容器初始化方式快47%?
  • 知从木牛瑞萨RH850 P1M-C软件算法优化实践CyberSecurity Application of ZC.MuNiu on Renesas RH850 ICUM
  • 【读书笔记】《臣服实验》
  • 开源免费的WPS AI 软件 察元AI文档助手:链路 012:structuredSystemPrompt 与单次 system 的关系
  • 全域数学三元本源公理体系 核心公式汇总表(永久典藏版)
  • Burp_Suite_Professional_2026.4
  • 终极指南:如何快速免费提取Ren‘Py游戏RPA归档文件
  • 基于AFSIM的空间目标动能拦截系统:最小化完整案例
  • 数据结构----插入排序
  • real-anime-z实战教程:用‘cherry blossom’+‘soft focus background’营造日系氛围感