Algorithms first
长度最小的子数组 · 交互式算法学习
找到和至少为 target 的最短连续子数组长度。
#209 · 滑动窗口
长度最小的子数组
Minimum Size Subarray Sum
target = 7, nums = [2,3,1,2,4,3]线性序列3 个关键状态
步骤 1窗口扩到和 8。
l=0,r=3,sum=82
03
11
22
34
43
5推荐
可收缩滑动窗口
时间
O(n)空间 O(1)右端扩张直到达标,再不断移动左端缩小窗口。
1function minSubArrayLen(target, a) {2 let l = 0,3 sum = 0,4 best = Infinity;5 for (let r = 0; r < a.length; r++) {6 sum += a[r];7 while (sum >= target) {8 best = Math.min(best, r - l + 1);9 sum -= a[l++];10 }11 }12 return best === Infinity ? 0 : best;13}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
1class Solution {2 public int minSubArrayLen(int target, int[] nums) {3 int n = nums.length;4 long[] s = new long[n + 1];5 for (int i = 0; i < n; ++i) {6 s[i + 1] = s[i] + nums[i];7 }8 int ans = n + 1;9 for (int i = 0; i <= n; ++i) {10 int j = search(s, s[i] + target);11 if (j <= n) {12 ans = Math.min(ans, j - i);13 }14 }15 return ans <= n ? ans : 0;16 }17 18 private int search(long[] nums, long x) {19 int l = 0, r = nums.length;20 while (l < r) {21 int mid = (l + r) >> 1;22 if (nums[mid] >= x) {23 r = mid;24 } else {25 l = mid + 1;26 }27 }28 return l;29 }30}交互式算法学习
从执行步骤真正理解 LeetCode 经典 150
本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。
AlgoViz Lab
长度最小的子数组 · 解法对比
找到和至少为 target 的最短连续子数组长度。
- 测试用例
target = 7, nums = [2,3,1,2,4,3]- 题目分类
- 滑动窗口
- 解法对比
- 2
枚举起点终点
每个起点向右累加,首次达到 target 时更新长度。
- 时间
O(n²)- 空间
O(1)
可收缩滑动窗口
右端扩张直到达标,再不断移动左端缩小窗口。
- 时间
O(n)- 空间
O(1)