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]

数据结构基础:好数对计数(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]

Hot100:Two Sum 两数之和哈希表一遍扫描与 ACERS 工程化解析(LeetCode 1)

副标题 / 摘要 Two Sum(两数之和)是最经典的数组哈希题:用“补数 + 哈希表”把 O(n^2) 降到 O(n)。本文按 ACERS 结构拆解题意、原理与工程迁移,并给出多语言可运行实现。 预计阅读时长:10~12 分钟 标签:Hot100、哈希表、数组、补数、面试高频 SEO 关键词:Two Sum, 两数之和, hash map, 补数, O(n), LeetCode 1, Hot100 元描述:两数之和的哈希表解法与工程应用解析,含复杂度对比与多语言代码。 目标读者 刚开始刷题,希望建立“补数 + 哈希表”基本模型的初学者 需要把算法思路迁移到工程问题的中级开发者 准备面试、想快速掌握高频题的求职者 背景 / 动机 “在一堆数字里找出两数之和”等价于一个快速配对问题,常见于对账、预算、风控、推荐等场景。 朴素暴力法虽然简单,但在数据量上来后会直接超时;哈希表一遍扫描能把复杂度从 O(n^2) 降到 O(n),是最工程可行的做法之一。 A — Algorithm(题目与算法) 题目还原 给定一个整数数组 nums 和一个整数目标值 target,请在该数组中找出和为目标值的 两个 整数,并返回它们的数组下标。 每种输入只会对应一个答案,并且你不能使用两次相同的元素。答案可以按任意顺序返回。 输入输出 名称 类型 描述 nums int[] 整数数组 target int 目标和 返回 int[] 满足 nums[i] + nums[j] == target 的下标 基础示例 nums target 输出 [2, 7, 11, 15] 9 [0, 1] [3, 2, 4] 6 [1, 2] 补数图示(示例 1) ...

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

最大正负数计数:用二分在排序数组中统计正整数和负整数数量的最大值(LeetCode 2529)

副标题 / 摘要 给定一个有序整数数组,如何在 O(log n) 时间内分别统计负数和正数的个数,并返回两者中的较大值?这道「Maximum Count of Positive & Negative Integers」正是边界型二分的练习题。本文用上下界二分一次性搞定负数结束和正数起点。 预计阅读时长:8~10 分钟 适用场景标签:二分查找、边界计数、排序数组 SEO 关键词:maximum count, positive negative, 二分统计, 上下界, 有序数组计数 目标读者与背景 目标读者 已经会写 basic binary search,希望进阶到“计数型二分”的同学; 在工程中有基于排序数据做区间计数需求的工程师; 准备面试,想把二分查找的上下界技巧练熟的开发者。 背景 / 动机 在各种日志 / 指标 / 数据分析场景中,我们经常会对有序数据做计数: 比如统计小于 0 的条目数量; 统计大于某个阈值的条目数量; 找到“负数段结束”和“正数段开始”的位置。 这道 LeetCode 题「Maximum Count of Positive & Negative Integers」是这类需求的简化模型,非常适合作为上下界二分的练习。 A — Algorithm(题目与算法) 题目重述 给定一个按非降序排序的整数数组 nums。 数组中可能包含负数、0 和正数。 定义: countNeg = 数组中小于 0 的元素数量; countPos = 数组中大于 0 的元素数量。 请返回 max(countNeg, countPos)。 输入 ...

2025年12月4日 · 8 分钟 · map[name:Jeanphilo]

比目标字母大的最小字母:有序字符数组上的二分查找技巧(LeetCode 744)

副标题 / 摘要 这道题看似只是“找一个比目标大的字母”,本质上是经典的上界二分(upper_bound)问题:在有序字符数组中找到第一个 > target 的元素,并在找不到时从头环绕。本文给出完整的二分模板和多语言实现,帮你稳拿这类边界题。 预计阅读时长:8~10 分钟 适用场景标签:二分查找进阶、字符数组、上界查找 SEO 关键词:find smallest letter greater than target, upper_bound, 二分查找字符数组 目标读者与背景 目标读者 已经掌握基本二分查找,想进一步熟悉上下界(upper/lower bound)的同学; 在工程中需要在有序集合中找到“下一个更大值”的开发者; 准备中高级面试,想通过一道题统一上界二分写法的工程师。 背景 / 动机 很多系统都会用到“环形有序列表”的概念: 比如按字母排序的标签、按时间排序的分片; 想要找“比当前值更大的下一个值”,找不到就从头开始。 这道题「Find Smallest Letter Greater Than Target」正是这种模式的简化版,是练习上界二分的好题。 A — Algorithm(题目与算法) 题目重述 给定一个按非降序排序的字符数组 letters,数组中的字母都是小写英文字母。 给定一个字符 target,请你找到数组中严格大于 target 的最小字母并返回。 注意:letters 数组是环绕的——如果不存在这样的字母,则返回数组的第一个元素。 输入 letters: 排序好的小写字母数组,长度为 n,且 letters 中至少有两个不同的字母; target: 一个小写字母。 输出 字符:数组中比 target 大的最小字母;若不存在,则为 letters[0]。 示例 1 letters = ['c', 'f', 'j'] target = 'a' 所有比 'a' 大的字母有 ['c', 'f', 'j']; 其中最小的是 'c'。 输出:'c' ...

2025年12月4日 · 6 分钟 · map[name:Jeanphilo]

经典 Binary Search:在排序数组中查找目标值索引的统一模板(LeetCode 704)

副标题 / 摘要 二分查找是所有算法面试和工程系统中的“必修课”。本文以最基础的「在有序数组中查找目标值」为例,从题意、边界到统一模板,系统整理 Binary Search 的写法,并配套多语言实现,帮助你彻底告别二分边界恐惧症。 预计阅读时长:8~10 分钟 适用场景标签:二分查找基础、数组检索、性能优化 SEO 关键词:binary search, LeetCode 704, 二分查找模板, 有序数组目标索引 目标读者与背景 目标读者 刚开始系统刷题、希望夯实基础二分查找的同学; 在工程中经常需要在有序列表中查找、定位数据的后端 / 前端工程师; 曾经被二分查找的边界条件困扰、希望形成统一模板的开发者。 为什么这题值得认真学? 它是 LeetCode 704:Binary Search,二分查找的最基础版本; 几乎所有高级二分题(Search Range、插入位置、求上下界)都以此为内核; 大量工程场景(有序列表查找、策略表、时间线等)都可以套用这个模板。 A — Algorithm(题目与算法) 题目重述 给定一个按非降序排序的整数数组 nums 和一个整数 target。 请你在数组中查找 target,如果存在,则返回其下标;否则,返回 -1。 要求算法的时间复杂度为 O(log n)。 输入 nums: 已排序(非降序)的整数数组,长度为 n target: 要查找的整数 输出 若 target 存在于 nums 中,则返回其下标; 否则返回 -1。 示例 1 nums = [-1, 0, 3, 5, 9, 12] target = 9 数组中存在 9,且在下标 4: ...

2025年12月4日 · 6 分钟 · map[name:Jeanphilo]

Hot100:Search Insert Position 排序数组中目标值插入位置的二分查找实战(LeetCode 35)

副标题 / 摘要 Search Insert Position 是二分查找的「Hello World」级题目:返回目标值在有序数组中的插入位置(存在返回下标,不存在返回应插入的下标)。本文用统一的 lower_bound 模板,把这个问题讲清楚,并展示其在日志、配置和策略表中的工程应用。 预计阅读时长:8~10 分钟 适用场景标签:二分查找入门、插入位置、范围查找 SEO 关键词:search insert position, lower_bound, 二分插入, 排序数组插入位置, LeetCode 35, Hot100 目标读者与背景 目标读者 知道二分查找基本原理,但还没形成自己的模板的同学; 在工程中经常对有序列表做插入 / 查找操作的后端 / 前端开发者; 刚开始刷 LeetCode,想用一道题把「下界二分」吃透的人。 为什么这题重要? 它是 most basic 的「lower_bound」模型: 第一个大于等于目标值的下标。 理解它之后: 起始位置 / 插入位置 / 统计 ≤ / ≥ 某值数量等,都可以统一用同一个模板。 在工程中: 策略阈值表、时间戳列表、版本列表等,都会用到类似逻辑。 A — Algorithm(题目与算法) 题目重述 给定一个按非降序排序的整数数组 nums 和一个目标值 target。 请在数组中搜索 target,如果存在则返回其下标; 如果不存在,则返回它按顺序插入时应该在的位置。 要求算法时间复杂度为 O(log n)。 输入 nums: 已排序(非降序)的整数数组,长度为 n target: 目标整数 输出 ...

2025年12月4日 · 6 分钟 · map[name:Jeanphilo]

Hot100:在排序数组中查找元素的起始和结束位置,一套二分模板搞定 Search Range(LeetCode 34)

副标题 / 摘要 很多同学会写“找一个等于目标的二分”,但一到“找目标的起始和结束位置”就容易被边界条件卡住。本文用统一的下界 / 上界二分模板,彻底吃透 Search Range 类型问题,并给出多语言实现和工程场景示例。 预计阅读时长:10~15 分钟 适用场景标签:二分查找、日志区间查询、时间序列检索 SEO 关键词:search range, first and last position, 二分查找边界, lower_bound, upper_bound, LeetCode 34, Hot100 目标读者与背景 目标读者 已经知道二分查找基本写法,但一到“找起始位置/结束位置”就容易出错的同学; 经常对日志、监控指标做时间区间检索的工程师; 准备面试时希望掌握一套可复用二分模板的开发者。 背景 / 动机 几乎所有互联网系统里都有“按时间排序的日志 / 事件 / 指标”: 比如按时间排序的访问日志; 按上报时间排序的监控数据点; 按 ID 排序的业务记录。 在这些有序数据上,最常见的操作之一就是: 找出“所有值等于 X 的记录”的区间 [start, end]。 这道 LeetCode 经典题「Search for a Range」正是这个需求的抽象版本。 A — Algorithm(题目与算法) 题目重述 给定一个按非降序排序的整数数组 nums 和一个目标值 target。 请在数组中找到目标值的起始位置和结束位置,以数组 [start, end] 形式返回。 如果数组中不存在目标值,返回 [-1, -1]。 要求时间复杂度为 O(log n)。 ...

2025年12月4日 · 9 分钟 · map[name:Jeanphilo]