LeetCode 题解工作台
统计作战单位数
n 名士兵站成一排。每个士兵都有一个 独一无二 的评分 rating 。 从中选出 3 个士兵组成一个作战单位,规则如下: 从队伍中选出下标分别为 i 、 j 、 k 的 3 名士兵,他们的评分分别为 rating[i] 、 rating[j] 、 rating[k] 作战单位需满足: rating…
4
题型
5
代码语言
3
相关题
当前训练重点
中等 · 状态·转移·动态规划
答案摘要
我们可以枚举数组 中每个元素 作为中间元素,然后统计左边比它小的元素的个数 ,右边比它大的元素的个数 ,那么以该元素为中间元素的作战单位的个数为 $l \times r + (i - l) \times (n - i - 1 - r)$,累加到答案中即可。 时间复杂度 ,空间复杂度 。其中 为数组 的长度。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路
题目描述
n 名士兵站成一排。每个士兵都有一个 独一无二 的评分 rating 。
从中选出 3 个士兵组成一个作战单位,规则如下:
- 从队伍中选出下标分别为
i、j、k的 3 名士兵,他们的评分分别为rating[i]、rating[j]、rating[k] - 作战单位需满足:
rating[i] < rating[j] < rating[k]或者rating[i] > rating[j] > rating[k],其中0 <= i < j < k < n
请你返回按上述条件组建的作战单位的方案数。
示例 1:
输入:rating = [2,5,3,4,1] 输出:3 解释:我们可以组建三个作战单位 (2,3,4)、(5,4,1)、(5,3,1) 。
示例 2:
输入:rating = [2,1,3] 输出:0 解释:根据题目条件,我们无法组建作战单位。
示例 3:
输入:rating = [1,2,3,4] 输出:4
提示:
n == rating.length3 <= n <= 10001 <= rating[i] <= 10^5rating中的元素都是唯一的
解题思路
方法一:枚举中间元素
我们可以枚举数组 中每个元素 作为中间元素,然后统计左边比它小的元素的个数 ,右边比它大的元素的个数 ,那么以该元素为中间元素的作战单位的个数为 ,累加到答案中即可。
时间复杂度 ,空间复杂度 。其中 为数组 的长度。
class Solution:
def numTeams(self, rating: List[int]) -> int:
ans, n = 0, len(rating)
for i, b in enumerate(rating):
l = sum(a < b for a in rating[:i])
r = sum(c > b for c in rating[i + 1 :])
ans += l * r
ans += (i - l) * (n - i - 1 - r)
return ans
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | O(n \cdot \log(\text{maxRating})) |
| 空间 | O(\text{maxRating}) |
面试官常问的追问
外企场景- question_mark
Look for strictly increasing or decreasing sequences of length three.
- question_mark
Check if the candidate avoids brute-force cubic time by counting sequences efficiently.
- question_mark
Verify understanding of state transitions and prefix-suffix relationships for DP.
常见陷阱
外企场景- error
Counting teams incorrectly by mixing indices instead of ratings order.
- error
Using nested loops without considering DP or BIT optimizations for larger arrays.
- error
Mismanaging prefix and suffix counts, leading to off-by-one errors in team totals.
进阶变体
外企场景- arrow_right_alt
Count teams of length k > 3 following increasing or decreasing rules.
- arrow_right_alt
Compute total teams allowing repeated ratings with adjusted DP rules.
- arrow_right_alt
Find the longest strictly increasing or decreasing subsequence instead of fixed-length teams.