Hot100:轮转数组(Rotate Array)三次反转 ACERS 解析

副标题 / 摘要 轮转数组是典型的数组变换题:把数组整体向右移动 k 位。本文用 ACERS 拆解“三次反转”的核心思路,并给出工程场景迁移与多语言可运行实现。 预计阅读时长:10~12 分钟 标签:Hot100、数组、旋转 SEO 关键词:Rotate Array, 轮转数组, 数组旋转, 反转, O(n) 元描述:三次反转法解决轮转数组,含复杂度对比、工程场景与多语言代码。 目标读者 正在刷 Hot100 的学习者 想掌握“数组原地变换”模板的中级开发者 需要处理时间序列对齐、轮值偏移的工程师 背景 / 动机 轮转数组在工程中非常常见: 轮值排班、时间序列对齐、环形缓冲区、前端轮播等都可以抽象为“整体右移 k 位”。 如果用逐步移动会变成 O(nk),在数据量稍大时就不可用,因此需要更高效的原地方案。 核心概念 轮转(rotate):把数组向右移动 k 位,后 k 个元素移到最前 k 取模:k %= n,避免 k 超过数组长度 反转(reverse):用双指针交换来原地反转区间 原地(in-place):在原数组上操作,额外空间 O(1) A — Algorithm(题目与算法) 题目还原 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 输入输出 名称 类型 描述 nums int[] 整数数组 k int 向右轮转步数 返回 int[] 轮转后的数组 示例 1(官方) 输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 示例 2(官方) 输入: nums = [-1,-100,3,99], k = 2 输出: [3,99,-1,-100] C — Concepts(核心思想) 关键思路:三次反转 反转整个数组 反转前 k 个 反转后 n-k 个 反转后的位置关系刚好等价于右移 k 位。 ...

2026年1月24日 · 5 分钟 · map[name:Jeanphilo]

Hot100:合并区间(Merge Intervals)排序扫描 ACERS 解析

副标题 / 摘要 合并区间是最典型的“排序 + 线性扫描”问题:先按起点排序,再顺序合并重叠区间。本文按 ACERS 结构拆解题意、核心概念、工程迁移与多语言实现,帮助你形成可复用的区间处理模型。 预计阅读时长:12~15 分钟 标签:Hot100、区间、排序、扫描线、合并区间 SEO 关键词:Merge Intervals, 合并区间, 区间合并, 排序, 扫描线 元描述:合并区间的排序扫描解法与工程应用解析,含复杂度对比与多语言实现。 目标读者 想掌握“区间合并”基础模型的初学者 需要把算法思路迁移到工程场景的中级开发者 正在准备算法面试、希望快速建立区间类题型的求职者 背景 / 动机 区间问题在日程排班、监控窗口、日志聚合、资源分配中非常常见。 如果没有一个统一的合并策略,很容易产生重复统计、冲突判断错误或资源浪费。 因此,“把重叠区间合成最少的不重叠集合”是工程与算法都高频出现的基础能力。 A — Algorithm(题目与算法) 题目还原 给定一个区间数组 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间。 请合并所有重叠的区间,并返回一个不重叠的区间数组,且能完整覆盖输入中的所有区间。 输入输出 名称 类型 描述 intervals int[][] 区间数组,元素为 [start, end] 返回 int[][] 合并后的不重叠区间数组 基础示例(官方) 输入 输出 [[1,3],[2,6],[8,10],[15,18]] [[1,6],[8,10],[15,18]] [[1,4],[4,5]] [[1,5]] 合并示意(示例 1) 排序后: [1,3] [2,6] [8,10] [15,18] 合并: [1,3] + [2,6] -> [1,6] 结果: [1,6] [8,10] [15,18] 思路概览 按区间起点升序排序(起点相同则按终点升序)。 线性扫描,维护当前合并区间 [cur_start, cur_end]。 如果下一个区间 next_start <= cur_end,则合并为 cur_end = max(cur_end, next_end)。 否则将当前区间放入结果,并以新起点开始下一段合并。 C — Concepts(核心思想) 核心概念 概念 含义 作用 重叠 next_start <= cur_end 判断是否需要合并 合并 cur_end = max(cur_end, next_end) 扩展当前区间 排序 按起点排序 让重叠区间相邻 方法类型 排序 + 线性扫描 + 贪心合并。 ...

2026年1月24日 · 6 分钟 · map[name:Jeanphilo]

Hot100:接雨水(Trapping Rain Water)双指针 / 前后最大值 ACERS 解析

副标题 / 摘要 接雨水是最经典的“区间高度约束”题。本文按 ACERS 模板讲清双指针思路、关键公式与工程迁移,并提供多语言可运行实现。 预计阅读时长:12~15 分钟 标签:Hot100、双指针、数组 SEO 关键词:Trapping Rain Water, 接雨水, 双指针, 前后最大值, O(n) 元描述:双指针 O(n) 求接雨水总量,含工程场景、复杂度分析与多语言代码。 目标读者 正在刷 Hot100 的学习者 需要掌握“左右边界约束”模板的中级开发者 处理地形/容量/水位等区间分析的工程师 背景 / 动机 接雨水问题本质是“每个位置能盛多少水”,与工程中的容量评估、缓冲区盈余、资源占用上限等模型高度相似。 朴素做法每个位置都向两侧找最高,复杂度 O(n^2)。 双指针与前后最大值可以把复杂度降到 O(n)。 核心概念 局部水位:water[i] = min(maxLeft[i], maxRight[i]) - height[i] 左右边界:当前位置两侧的最高柱子决定水位上限 双指针:用左/右指针同步维护左右最大值 A — Algorithm(题目与算法) 题目还原 给定 n 个非负整数表示每个宽度为 1 的柱子的高度,计算按此排列的柱子能接多少雨水。 输入输出 名称 类型 描述 height int[] 柱子高度数组 返回 int 能接住的雨水总量 示例 1(官方) height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出 = 6 示例 2(官方) height = [4,2,0,3,2,5] 输出 = 9 C — Concepts(核心思想) 关键公式 对任意位置 i: ...

2026年1月24日 · 5 分钟 · map[name:Jeanphilo]

固定间距 1 检测:一次扫描判断 1 之间至少 k 个间隔(LeetCode 1437)

副标题 / 摘要 固定间距 1 检测是典型的“事件间距校验”模型。本文按 ACERS 结构拆解题意、原理与工程迁移,并给出多语言可运行实现。 预计阅读时长:10~12 分钟 标签:数组、双指针、事件间距 SEO 关键词:固定间距 1 检测, 事件间距, LeetCode 1437, O(n) 元描述:一次扫描判断所有 1 是否至少相隔 k 个位置,含工程场景、复杂度对比与多语言代码。 目标读者 刷 LeetCode 并希望沉淀“模板题”的学习者 做监控/风控/行为分析的工程师 需要判断事件间隔是否合规的系统开发者 背景 / 动机 许多系统都有“事件不能过密”的约束:例如登录失败、报警事件、敏感操作、API 调用等。 这类问题的本质是 “事件间距是否满足阈值”,与该题完全等价。 如果能用 O(n) 一次扫描完成校验,就能直接迁移到实时系统。 核心概念 事件间距:两个事件之间至少有 k 个“空位” 在线校验:只记住上一次事件的位置即可 边界处理:初始化 last = -k-1,消除首个事件特判 A — Algorithm(题目与算法) 题目还原 给定整数数组 nums 与整数 k,若任意两个 1 之间至少有 k 个 0(等价于两次 1 的索引差 > k),返回 true,否则返回 false。 输入输出 名称 类型 描述 nums int[] 仅包含 0/1 的数组 k int 需要的最小间隔 返回 bool 是否满足间距约束 示例 1 nums = [1,0,0,0,1,0,0,1], k = 2 输出: true 示例 2 nums = [1,0,1], k = 2 输出: false C — Concepts(核心思想) 关键观察 只需要记住 上一个 1 的索引 last 当遇到新的 1:若 i - last <= k,说明间隔不足 否则更新 last = i 方法归类 单次线性扫描(One-pass Scan) 事件间距校验(Event Spacing Check) 双指针 / 贪心(Greedy with last pointer) 数学表达 若 i 和 j 是两个 1 的索引(i < j),要求: ...

2026年1月22日 · 5 分钟 · map[name:Jeanphilo]

判断一个数是否为 2 的幂(Power of Two):位运算 O(1) ACERS 解析(LeetCode 231)

副标题 / 摘要 2 的幂判断是位运算最经典的模板题之一。本文按 ACERS 结构讲清原理、工程场景与常见误区,并给出可复用的多语言实现。 预计阅读时长:8~12 分钟 标签:位运算、二进制、数学 SEO 关键词:Power of Two, 2 的幂, 位运算, bit manipulation, LeetCode 231 元描述:用位运算 O(1) 判断 2 的幂,含工程应用、复杂度分析与多语言代码。 目标读者 刚开始接触位运算的算法学习者 想沉淀“位运算模板题”的中级开发者 在系统/后端中需要对齐、分片、容量判断的工程师 背景 / 动机 “2 的幂”是很多工程系统的隐含约束:哈希表容量、内存对齐、任务分片、FFT 窗口大小等。 如果每次判断都用循环或除法,不仅慢,而且容易写出边界错误。 位运算提供了 O(1) 的稳定判断,是可长期复用的基础能力。 核心概念 二进制表示:2 的幂在二进制中只有一个 1,其余全是 0 位与运算:n & (n - 1) 会清除最低位的 1 必要条件:n > 0,排除 0 和负数 A — Algorithm(题目与算法) 题目还原 给定一个整数 n,判断它是否为 2 的幂。 如果是返回 true,否则返回 false。 输入输出 名称 类型 说明 n int 待判断整数 返回 bool 是否为 2 的幂 示例 1 输入: n = 1 输出: true 解释: 2^0 = 1 示例 2 输入: n = 12 输出: false 解释: 12 的二进制是 1100,含多个 1 C — Concepts(核心思想) 核心原理:一次位运算完成判断 2 的幂的二进制形态:1000...000(只有一个 1) n - 1 会把这个 1 变成 0,右侧全部变成 1 因此: n = 1000...000 n - 1 = 0111...111 n & (n - 1) = 0000...000 结论: ...

2026年1月21日 · 4 分钟 · map[name:Jeanphilo]

LeetCode 76:最小覆盖子串(Minimum Window Substring)滑动窗口 ACERS 解析

副标题 / 摘要 最小覆盖子串是“可变滑动窗口 + 计数哈希表”的经典题。本文按 ACERS 模板解释如何判断窗口有效、如何收缩得到最短答案,并给出工程场景与多语言实现。 预计阅读时长:12~15 分钟 标签:滑动窗口、哈希表、字符串 SEO 关键词:Minimum Window Substring, 最小覆盖子串, 滑动窗口, 哈希表 元描述:最小覆盖子串的 O(n) 滑动窗口解法与工程应用,含多语言实现。 目标读者 正在刷 LeetCode 的中级开发者 需要掌握“可变窗口 + 覆盖约束”的算法模板 做文本分析、日志聚合或流式过滤的工程师 背景 / 动机 “在一段序列中找到最短区间覆盖目标集合”在工程中非常常见: 日志告警需要覆盖多种错误码,搜索摘要需要覆盖关键字, 运营分析需要覆盖多个行为标签。 本题提供了一个可复用的窗口收缩模板。 核心概念 可变滑动窗口:右指针扩张直到满足条件,左指针收缩缩短答案 计数哈希表:支持重复字符,必须按次数覆盖 满足条件的计数:判断当前窗口是否“覆盖了全部需要” A — Algorithm(题目与算法) 题目重述 给定字符串 s 和 t,返回 s 中最短的子串,使其包含 t 中的每一个字符(包括重复字符)。 若不存在这样的子串,返回空字符串 ""。 测试用例保证答案唯一。 输入输出 名称 类型 描述 s string 源字符串 t string 目标字符串(需要覆盖的字符与次数) 返回 string 最短覆盖子串或空串 示例 1 s = "ADOBECODEBANC", t = "ABC" 输出 = "BANC" 示例 2 s = "a", t = "a" 输出 = "a" 示例 3 s = "a", t = "aa" 输出 = "" C — Concepts(核心思想) 方法类型 可变滑动窗口 + 频次覆盖判断。 ...

2026年1月20日 · 9 分钟 · map[name:Jeanphilo]

LeetCode 1456:最大元音子串数量的滑动窗口 ACERS 解析

副标题 / 摘要 最大元音子串数量是“固定窗口计数”的标准模板题。本文按 ACERS 结构讲清楚滑动窗口的核心思想,并给出工程场景与多语言实现。 预计阅读时长:10~12 分钟 标签:滑动窗口、字符串、固定窗口 SEO 关键词:Maximum Number of Vowels, 最大元音子串, 滑动窗口, 固定窗口 元描述:滑动窗口求固定长度子串最大元音数,含工程化应用与多语言代码。 目标读者 正在刷 LeetCode / Hot100 的同学 想建立“固定窗口计数”模板的中级开发者 需要做日志/指标窗口统计的工程师 背景 / 动机 固定长度窗口内的最大计数是工程里极常见的需求: 监控系统统计异常峰值、运营分析统计活跃峰值、NLP 统计特征峰值。 如果每次窗口都重新计算,会退化为 O(nk)。 滑动窗口能让每步更新变成 O(1),把整体降到 O(n)。 核心概念 固定滑动窗口:窗口长度固定为 k,只右移一位 增量更新:进入右端元素、移除左端元素 条件计数:只统计满足条件(本题为元音)的元素数量 A — Algorithm(题目与算法) 题目重述 给你一个字符串 s 和整数 k。 返回长度为 k 的子串中,元音字符数量的最大值。 输入输出 名称 类型 描述 s string 只包含小写英文字符 k int 窗口长度 返回 int 任意长度为 k 的子串中最大元音数 示例 1 s = "abciiidef", k = 3 输出 = 3 示例 2 s = "aeiou", k = 2 输出 = 2 C — Concepts(核心思想) 方法类型 固定滑动窗口 + 条件计数。 ...

2026年1月20日 · 6 分钟 · map[name:Jeanphilo]

LeetCode 1513:仅含 1 的子串数量(连续 1 子串计数)ACERS 解析

副标题 / 摘要 这是“连续 1 子串计数”的标准题:用 cur 维护以当前位置结尾的连续 1 长度即可在线累加答案。本文按 ACERS 模板给出清晰模型、工程场景与多语言实现。 预计阅读时长:10~12 分钟 标签:计数、字符串、连续段 SEO 关键词:Number of Substrings With Only 1s, 连续1子串, LeetCode 1513 元描述:在线统计连续 1 子串数量的 O(n) 解法与工程化应用。 目标读者 正在刷 LeetCode / 准备面试的同学 想建立“连续段计数”模板的中级开发者 做日志分析、监控与行为统计的工程师 背景 / 动机 “只含 1 的连续子串数量”看似简单,但它对应一类非常常见的工程统计: 连续事件强度、稳定性评分、连续活跃天数、心跳连续正常等。 掌握这题等于掌握“连续段贡献计数”的可复用模型。 核心概念 连续子串:必须连续,不能跳过元素 连续段(run):一段连续的 1 在线累加(cur 模型):记录以当前位置结尾的连续 1 长度 取模:答案可能很大,需要取 1e9+7 A — Algorithm(题目与算法) 题目重述 给你一个二进制字符串 s,请返回 仅由字符 ‘1’ 组成的子串 的数量。 子串要求连续且非空。 输入输出 名称 类型 描述 s string 只包含 ‘0’ 和 ‘1’ 返回 int 仅含 1 的子串数量(取模) 示例 s = "0110111" 输出 = 9 解释:连续 1 段为长度 2 和 3,贡献分别为 3 和 6,总和 9。 ...

2026年1月18日 · 5 分钟 · map[name:Jeanphilo]

滑动窗口最大值:单调队列(Monotonic Queue)一遍扫描 ACERS 解析

副标题 / 摘要 滑动窗口最大值是“滑动窗口 + 单调队列”的经典组合题。本文按 ACERS 模板拆解思路,给出可复用的工程做法与多语言实现。 预计阅读时长:12~15 分钟 标签:滑动窗口、单调队列、数组 SEO 关键词:Sliding Window Maximum, 滑动窗口最大值, 单调队列, deque, O(n) 元描述:滑动窗口最大值的单调队列解法与工程应用,含复杂度分析与多语言代码。 目标读者 正在刷 LeetCode / Hot100 的同学 想建立“滑动窗口 + 单调队列”模板的中级开发者 做实时监控、日志分析、风控的工程师 背景 / 动机 连续窗口的最大值在工程里非常常见: 延迟监控、价格波动、温度报警、在线指标平滑等都需要“窗口最大值”。 暴力做法每次窗口重算最大值是 O(nk),当 n 很大时会不可接受。 单调队列能把复杂度降到 O(n),是最工程可行的方案之一。 核心概念 滑动窗口:固定长度 k 的连续区间 单调队列:队列中元素按值单调递减,队首永远是当前最大值 索引维护:用索引判断元素是否过期(离开窗口) A — Algorithm(题目与算法) 题目还原 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组最左侧移动到最右侧。 你只能看到窗口内的 k 个数字,窗口每次右移一位。 返回每个窗口中的最大值。 输入输出 名称 类型 描述 nums int[] 整数数组 k int 窗口大小 返回 int[] 每个窗口的最大值 示例 1 nums = [1,3,-1,-3,5,3,6,7], k = 3 输出 = [3,3,5,5,6,7] 示例 2 nums = [1], k = 1 输出 = [1] C — Concepts(核心思想) 方法类型 滑动窗口 + 单调队列(Monotonic Queue)。 ...

2026年1月18日 · 6 分钟 · map[name:Jeanphilo]

Hot100:和为 K 的子数组(Subarray Sum Equals K)前缀和 + 哈希表 ACERS 解析

副标题 / 摘要 这是 Hot100 专栏第 1 篇:和为 K 的子数组。本文用“前缀和 + 频次哈希表”把 O(n^2) 降到 O(n),并按 ACERS 模板给出工程场景与多语言实现。 预计阅读时长:12~15 分钟 标签:Hot100、前缀和、哈希表 SEO 关键词:Subarray Sum Equals K, 和为K的子数组, 前缀和, 哈希表, O(n) 元描述:和为 K 的子数组计数问题的前缀和解法,含工程迁移、复杂度对比与多语言代码。 目标读者 正在刷 Hot100,希望建立稳定算法模板的初学者 需要把计数类算法迁移到业务数据统计的中级工程师 准备面试,想掌握“前缀和 + 哈希表”核心套路的人 背景 / 动机 “统计和为 K 的子数组数量”是最经典的计数类问题之一。 它广泛出现在日志分析、风控阈值命中、交易序列统计等场景。 朴素的两层遍历虽然直观,但一旦数据规模增大就会明显卡顿,因此需要可扩展的 O(n) 解法。 核心概念(必须理解) 子数组:数组中连续、非空的片段 前缀和:prefix[i] = nums[0..i] 的和 差分关系:若 prefix[r] - prefix[l-1] = k,则 nums[l..r] 的和为 k 频次哈希表:统计某个前缀和出现的次数,以 O(1) 均摊时间查询 A — Algorithm(题目与算法) 题目还原 给你一个整数数组 nums 和一个整数 k,请统计并返回 和为 k 的子数组 的个数。 子数组是数组中元素的连续非空序列。 ...

2026年1月17日 · 6 分钟 · map[name:Jeanphilo]