LeetCode 题解工作台
不间断子数组
给你一个下标从 0 开始的整数数组 nums 。 nums 的一个子数组如果满足以下条件,那么它是 不间断 的: i , i + 1 ,..., j 表示子数组中的下标。对于所有满足 i 1 , i 2 的下标对,都有 0 1 ] - nums[i 2 ]| 。 请你返回 不间断 子数组的总数目。 …
6
题型
4
代码语言
3
相关题
当前训练重点
中等 · 滑动窗口(状态滚动更新)
答案摘要
我们可以用双指针 和 维护当前子数组的左右端点,用一个有序列表维护当前子数组的所有元素。 遍历数组 ,对于当前遍历到的数字 ,我们将其加到有序列表中,如果此时有序列表中的最大值与最小值的差值大于 ,那么我们循环右移指针 ,不断将 从有序列表中移出,直到列表为空或者有序列表元素的最大差值不大于 。此时不间断的子数组数目为 $j - i + 1$,我们将其添加到答案中。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 滑动窗口(状态滚动更新) 题型思路
题目描述
给你一个下标从 0 开始的整数数组 nums 。nums 的一个子数组如果满足以下条件,那么它是 不间断 的:
i,i + 1,...,j表示子数组中的下标。对于所有满足i <= i1, i2 <= j的下标对,都有0 <= |nums[i1] - nums[i2]| <= 2。
请你返回 不间断 子数组的总数目。
子数组是一个数组中一段连续 非空 的元素序列。
示例 1:
输入:nums = [5,4,2,4] 输出:8 解释: 大小为 1 的不间断子数组:[5], [4], [2], [4] 。 大小为 2 的不间断子数组:[5,4], [4,2], [2,4] 。 大小为 3 的不间断子数组:[4,2,4] 。 没有大小为 4 的不间断子数组。 不间断子数组的总数目为 4 + 3 + 1 = 8 。 除了这些以外,没有别的不间断子数组。
示例 2:
输入:nums = [1,2,3] 输出:6 解释: 大小为 1 的不间断子数组:[1], [2], [3] 。 大小为 2 的不间断子数组:[1,2], [2,3] 。 大小为 3 的不间断子数组:[1,2,3] 。 不间断子数组的总数目为 3 + 2 + 1 = 6 。
提示:
1 <= nums.length <= 1051 <= nums[i] <= 109
解题思路
方法一:有序列表 + 双指针
我们可以用双指针 和 维护当前子数组的左右端点,用一个有序列表维护当前子数组的所有元素。
遍历数组 ,对于当前遍历到的数字 ,我们将其加到有序列表中,如果此时有序列表中的最大值与最小值的差值大于 ,那么我们循环右移指针 ,不断将 从有序列表中移出,直到列表为空或者有序列表元素的最大差值不大于 。此时不间断的子数组数目为 ,我们将其添加到答案中。
遍历结束,返回答案即可。
时间复杂度 ,空间复杂度 。其中 是数组 的长度。
class Solution:
def continuousSubarrays(self, nums: List[int]) -> int:
ans = i = 0
sl = SortedList()
for x in nums:
sl.add(x)
while sl[-1] - sl[0] > 2:
sl.remove(nums[i])
i += 1
ans += len(sl)
return ans
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | O(n) |
| 空间 | O(1) |
面试官常问的追问
外企场景- question_mark
Looks for a sliding window with dynamic state updates.
- question_mark
Checks understanding of monotonic queue usage for max-min tracking.
- question_mark
May ask how to handle large arrays efficiently in O(n).
常见陷阱
外企场景- error
Forgetting to shrink the window when max-min exceeds allowed range.
- error
Incorrectly updating monotonic queues when elements leave the window.
- error
Counting subarrays incorrectly by not considering all subarrays ending at current index.
进阶变体
外企场景- arrow_right_alt
Compute subarrays with sum constraints instead of max-min differences.
- arrow_right_alt
Count subarrays with exactly k distinct elements using similar sliding window techniques.
- arrow_right_alt
Find the longest continuous subarray under the same max-min constraint.