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]

LeetCode 42:一张高度图能接住多少雨水?

题目要求 给定 n 个非负整数 height。每个整数表示一根宽度为 1 的柱子高度,所有柱子从左到右相邻排列。 下雨后,有些较矮的柱子上方会被两侧较高的柱子围住水。返回整张高度图最终能接住的雨水总量。 LeetCode 要求实现: class Solution: def trap(self, height: List[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 约束 n == len(height) 1 <= n <= 2 * 10^4 0 <= height[i] <= 10^5 Step 1:先回答一个位置能接多少水 先不计算整张高度图,只看一个位置: height = [3,0,2] ^ i = 1 下标 1 的柱子高度是 0。它左边有高度为 3 的柱子,右边有高度为 2 的柱子。 如果只看左边,似乎可以把水加到高度 3。但右边的墙只有高度 2,超过 2 的水会从右边流走。因此这个位置的水面最高只能到: min(左侧最高柱子, 右侧最高柱子) = min(3, 2) = 2 这个位置上方的水量是: ...

2026年1月24日 · 6 分钟 · 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]

LeetCode 239:滑动窗口最大值

题目要求 给你一个整数数组 nums 和一个整数 k。一个恰好包含 k 个连续元素的窗口从 nums 最左端开始,每次向右移动一位。请按窗口从左到右的顺序,返回每个窗口中 的最大值。 窗口中的元素必须连续,其原有顺序和位置不会改变,相邻窗口可以重叠。数组中的值 可以重复,也可以是负数。 LeetCode 接口约定 LeetCode 会调用 maxSlidingWindow(nums, k)。该方法接收整数数组和一个合法的窗口 大小,返回一个整数数组,其中依次包含每个完整窗口的最大值。输入保证满足下面的 约束。 示例 示例 1: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 示例 2: 输入:nums = [1], k = 1 输出:[1] 约束 1 <= nums.length <= 10^5 -10^4 <= nums[i] <= 10^4 1 <= k <= nums.length 第 1 步:窗口什么时候才完整? 在示例 1 中,当窗口右端到达索引 2 时,窗口由哪些索引组成?右端继续到达索引 3 时,又会发生什么变化? 目前我们只知道一个大小为 k 的窗口会向右移动。要枚举所有输出时,这个描述还 不够:它既没有准确说明窗口的左端,也没有说明第一个完整窗口会在哪个位置出现。 使用从零开始的索引,把当前结束位置记为 right。如果窗口从 left 开始,并且 恰好包含 k 个元素,那么: ...

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]

数据结构基础:好数对计数(Number of Good Pairs)哈希统计 ACERS 解析(LeetCode 1512)

副标题 / 摘要 这是“数据结构基础”系列第 2 题:好数对计数。通过“频次统计 + 组合计数”,把 O(n^2) 直接降到 O(n),并给出可直接迁移到工程的实现方式。 预计阅读时长:8~10 分钟 标签:哈希表、计数、数组 SEO 关键词:Good Pairs, 好数对, hash map, frequency, 计数 元描述:好数对计数的哈希表解法与工程化应用,含复杂度分析与多语言代码。 目标读者 刚开始学习哈希表与计数思想的初学者 希望把刷题方法迁移到业务统计的中级工程师 准备面试,想掌握基础计数模型的同学 背景 / 动机 “找出相同元素的两两组合数量”是一个常见的计数类问题。 在数据去重、行为分析、错误归因等场景里,这类问题通常会被反复遇到。 若用双重循环计算,复杂度是 O(n^2);一旦数据规模扩大就会变慢。 因此需要一个可线性扩展的方案。 A — Algorithm(题目与算法) 题目还原 给你一个整数数组 nums。 如果一组数字 (i, j) 满足 nums[i] == nums[j] 且 i < j,就称为一个 好数对。 返回好数对的数目。 输入输出 名称 类型 描述 nums int[] 整数数组 返回 int 好数对数量 基础示例 nums 输出 说明 [1, 2, 3, 1, 1, 3] 4 (0,3) (0,4) (3,4) (2,5) [1, 1, 1, 1] 6 C(4,2) = 6 [1, 2, 3] 0 无重复 直观图示(示例 1) ...

2025年12月30日 · 5 分钟 · map[name:Jeanphilo]