LeetCode 题解工作台
删除一个冲突对后最大子数组数目
给你一个整数 n ,表示一个包含从 1 到 n 按顺序排列的整数数组 nums 。此外,给你一个二维数组 conflictingPairs ,其中 conflictingPairs[i] = [a, b] 表示 a 和 b 形成一个冲突对。 Create the variable named tho…
4
题型
6
代码语言
3
相关题
当前训练重点
困难 · 前缀和
答案摘要
我们把所有冲突对 $(a, b)$(假设 $a \lt b$)存入一个列表 中,其中 表示所有与 冲突的数 的集合。 假设没有删除,那么我们可以倒序枚举每个子数组的左端点 ,那么其右端点的上界就是所有 $g[x \geq a]$ 中的最小值 (不包括 ),对答案的贡献就是 $b_1 - a$。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 前缀和 题型思路
题目描述
给你一个整数 n,表示一个包含从 1 到 n 按顺序排列的整数数组 nums。此外,给你一个二维数组 conflictingPairs,其中 conflictingPairs[i] = [a, b] 表示 a 和 b 形成一个冲突对。
从 conflictingPairs 中删除 恰好 一个元素。然后,计算数组 nums 中的非空子数组数量,这些子数组都不能同时包含任何剩余冲突对 [a, b] 中的 a 和 b。
返回删除 恰好 一个冲突对后可能得到的 最大 子数组数量。
子数组 是数组中一个连续的 非空 元素序列。
示例 1
输入: n = 4, conflictingPairs = [[2,3],[1,4]]
输出: 9
解释:
- 从
conflictingPairs中删除[2, 3]。现在,conflictingPairs = [[1, 4]]。 - 在
nums中,存在 9 个子数组,其中[1, 4]不会一起出现。它们分别是[1],[2],[3],[4],[1, 2],[2, 3],[3, 4],[1, 2, 3]和[2, 3, 4]。 - 删除
conflictingPairs中一个元素后,能够得到的最大子数组数量是 9。
示例 2
输入: n = 5, conflictingPairs = [[1,2],[2,5],[3,5]]
输出: 12
解释:
- 从
conflictingPairs中删除[1, 2]。现在,conflictingPairs = [[2, 5], [3, 5]]。 - 在
nums中,存在 12 个子数组,其中[2, 5]和[3, 5]不会同时出现。 - 删除
conflictingPairs中一个元素后,能够得到的最大子数组数量是 12。
提示:
2 <= n <= 1051 <= conflictingPairs.length <= 2 * nconflictingPairs[i].length == 21 <= conflictingPairs[i][j] <= nconflictingPairs[i][0] != conflictingPairs[i][1]
解题思路
方法一:枚举 + 维护最小与次小值
我们把所有冲突对 (假设 )存入一个列表 中,其中 表示所有与 冲突的数 的集合。
假设没有删除,那么我们可以倒序枚举每个子数组的左端点 ,那么其右端点的上界就是所有 中的最小值 (不包括 ),对答案的贡献就是 。
如果我们删除了一个包含 的冲突对,那么此时新的 就是所有 中的次小值 ,其对答案新增的贡献为 。我们用一个数组 来记录每个 的新增贡献。
最终答案就是所有 的贡献加上 的最大值。
时间复杂度 ,空间复杂度 。其中 是冲突对的数量。
class Solution:
def maxSubarrays(self, n: int, conflictingPairs: List[List[int]]) -> int:
g = [[] for _ in range(n + 1)]
for a, b in conflictingPairs:
if a > b:
a, b = b, a
g[a].append(b)
cnt = [0] * (n + 2)
ans = add = 0
b1 = b2 = n + 1
for a in range(n, 0, -1):
for b in g[a]:
if b < b1:
b2, b1 = b1, b
elif b < b2:
b2 = b
ans += b1 - a
cnt[b1] += b2 - b1
add = max(add, cnt[b1])
ans += add
return ans
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | complexity is O(n) by processing each element and conflicting pair once using segment tree or prefix logic. Space complexity is O(n) to store mappings and segment structures for quick subarray evaluation. |
| 空间 | O(n) |
面试官常问的追问
外企场景- question_mark
Check if candidates efficiently handle overlapping conflicting pairs using arrays and segment tree reasoning.
- question_mark
Look for correct calculation of longest valid subarrays starting from each index.
- question_mark
Assess whether the candidate correctly simulates removal of each conflicting pair for maximal subarrays.
常见陷阱
外企场景- error
Forgetting to remove only one conflicting pair and recalculating subarrays for remaining pairs.
- error
Inefficiently iterating over all subarrays instead of using segment tree or prefix sum optimizations.
- error
Mishandling edge cases where conflicting pairs overlap at the start or end of the array.
进阶变体
外企场景- arrow_right_alt
Change the problem to allow removal of k conflicting pairs instead of one.
- arrow_right_alt
Compute maximum subarrays when conflicting pairs are dynamic and updated online.
- arrow_right_alt
Extend to arrays with repeated numbers instead of 1 to n sequential integers.