长度最小子数组 & 螺旋矩阵 & 区间和
约 308 个字 132 行代码 预计阅读时间 3 分钟
209.长度最小的子数组
描述: 正整数数组里面找 >= target的长度最小的连续子数组
1、暴力,两次循环找所有情况,比较更新子数组长度和结果
18/21 cases passed (N/A) TLE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
PS: 关于C++最大值的设置: ref
2、滑动窗口, 也即双指针的一种,一个for循环降低复杂度。key: 起始位置i动态的移动
- 通过窗口不断调整子数组起始位置,使窗口内元素满足要求。动图参考
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
59.螺旋矩阵II
模拟填充的过程,循环遍历,注意特殊情况和区间边界
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
区间和
给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和
(暴力求解会TLE)
前缀和:重复利用计算过的子数组之和,从而降低区间查询需要累加计算的次数
- 若求下标2至5的区间和,则对应前缀和数组
s[5]-s[1]
(两数组都从0开始)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
PS: 注意前缀和数组和原来数组下标从哪开始! C++中scanf/printf
要比cout/cin
效率高
for (int i = 1;i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i];