LeetCode每日一题2025-04-27
3392. 统计符合条件长度为 3 的子数组数目 E
给你一个整数数组 nums ,请你返回长度为 3 的 子数组 的数量,满足第一个数和第三个数的和恰好为第二个数的一半。
子数组 指的是一个数组中连续 非空 的元素序列。
示例 1:
输入: nums = [1,2,1,4,1]
输出: 1
解释:
只有子数组
[1,4,1]包含 3 个元素且第一个和第三个数字之和是中间数字的一半。number.
示例 2:
输入: nums = [1,1,1]
**输出: ** 0
解释:
[1,1,1]是唯一长度为 3 的子数组,但第一个数和第三个数的和不是第二个数的一半。
提示:
3 <= nums.length <= 100-100 <= nums[i] <= 100
问题分析
输入:长度为 的整数数组 nums,满足 ,元素取值 。
目标:统计所有长度恰好为 3 的连续子数组 ,使得
因为子数组长度固定且很小(仅 3),子数组个数仅 ,可线性枚举,每个子数组只涉及 3 个元素,检查条件恒为常数时间。
算法思路
-
初始化
- 计数器
ans = 0。
- 计数器
-
遍历“中间位置”
-
令指针 从 1 到 (包含),那么第 个元素就是子数组的中间元素 。
-
子数组的首尾分别是:
-
-
判断并累加
-
检查条件:
-
如果成立,
ans += 1。
-
-
返回结果
- 遍历结束后,
ans即为满足条件的子数组数量。
- 遍历结束后,
时间复杂度
时间复杂度:
- 暴力枚举每个窗口需要 次检查,其中 ,每次检查 ,只需一次线性遍历,整体 。
空间复杂度:
- 仅使用常数级额外变量计数,。
代码分解
1 | function countSubarrays(nums): |
-
range(1, len(nums)-1):因为窗口长度固定 3,首元素索引为 ,尾元素索引为 ,故 取值区间为 。 -
每次循环只做一次加法、一次乘法、一次比较,都是 操作。
代码实现
1 | from typing import List |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Stay hungry. Stay foolish.!
评论
