面试经典-长度最小的子数组
长度最小的子数组
题目
给定一个含有
n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于
target的长度最小的子数组
[numsl, numsl+1, ..., numsr-1, numsr],并返回其长度。如果不存在符合条件的子数组,返回0。示例 1:
1
2
3 输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。示例 2:
1
2 输入:target = 4, nums = [1,4,4]
输出:1示例 3:
1
2 输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0提示:
1 <= target <= 1091 <= nums.length <= 1051 <= nums[i] <= 104进阶:
- 如果你已经实现
O(n)时间复杂度的解法, 请尝试设计一个O(n log(n))时间复杂度的解法。
题解
题解一(暴力法)
1 | public static int minSubArrayLen(int target, int[] nums) { |
最简单,也是最容易想到的方法,但就是会超时,时间复杂度 O(n^2)

题解二(滑动窗口)
看的Leetcode官方题解🤭🤭🤭,可以理解为双指针
1 | public static int minSubArrayLen(int target, int[] nums) { |

题解三(前缀和)
这里首先要理解什么是前缀和,以及前缀和能解决什么问题
1. 快速计算区间和
- 问题:计算数组中多个区间的和,例如 [l1,r1],[l2,r2],…[l_1, r_1], [l_2, r_2], \dots[l1,r1],[l2,r2],…。
- 利用前缀和,可以在 O(1)O(1)O(1) 时间内得到每个区间的和。
2. 检测某种和的区间
- 问题:寻找一个子数组,使其和等于给定的目标值。
- 思路:利用前缀和,判断是否存在
sums[j] - sums[i] == target,可用哈希表优化查询。
3. 寻找和满足某些条件的区间
- 问题:寻找子数组使其和大于等于某个值(如“最小长度子数组和问题”)。
- 思路:结合前缀和与二分搜索,快速找到满足条件的右边界。
4. 处理二维数组的区域和
- 在二维数组中,前缀和扩展到二维,用于快速计算子矩阵的和。
- 构建二维前缀和 sums[i][j]sums[i][j]sums[i][j],表示从左上角到位置 (i,j)(i, j)(i,j) 的元素总和。
5. 解决连续性统计问题
- 问题:统计数组中满足某些条件的子数组数量(如和为 kkk 的子数组)。
- 思路:利用前缀和的性质,通过哈希表统计满足条件的前缀和数量。
1 | public static int minSubArrayLen(int target, int[] nums) { |

这位同学简直是天才😂😂😂😂

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 可乐大红袍🥤🥤🥤!