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]

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]

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]

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]

LeetCode 34:在排序数组中查找元素的第一个和最后一个位置

题目要求 先看官方示例中的输入 nums = [5,7,7,8,8,10] 和 target = 8。答案必须是完整范围 [3,4];只返回下标 3 或 4,都没有回答目标值第一次和最后一次出现在哪里。 给定一个按非递减顺序排列的整数数组 nums 和一个整数 target: 如果 target 存在,返回它第一次和最后一次出现的下标 [first, last]。 如果 target 不存在,返回 [-1, -1]。 题目最终要求算法的运行时间为 O(log n)。 LeetCode 使用以下方法契约: class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: 官方示例 输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4] 输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1] 输入:nums = [], target = 0 输出:[-1,-1] 约束 0 <= nums.length <= 10^5 -10^9 <= nums[i] <= 10^9 -10^9 <= target <= 10^9 nums 按非递减顺序排列。 Step 1:先得到一个肯定正确的范围 当目标值连续出现多次时,怎样保证同时记录最早和最晚的下标? ...

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