题目:统计作战单位数
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
请你返回按上述条件可以组建的作战单位数量。每个士兵都可以是多个作战单位的一部分。
首先有个笨办法:三重循环找到符合条件的组合,很容易写,但是时间复杂度和空间复杂度都很高,所有我们找寻更简洁的方法。
思路:
对于只有三个人的队伍,只要确定了中间的士兵,即C位士兵,那么在左边找到rating比C位低的士兵,在右边找到比C位rating高的士兵,就可以组成一个由低到高的组合了,反过来对倒序的rating列表同样的操作,可以得到由高到低的组合。
来看代码了解细节吧。。。
def numTeams(rating):
n=len(rating)
def fun(rating):
num=0
for i in range(1,n-1): # 找一个C位 a
a=rating[i]
n1=0
n2=0
for j in range(0,i): # C位左边小于a的个数
if rating[j]<a:
n1+=1
for k in range(i+1,n): # C位右边大于a的个数
if rating[k]>a:
n2+=1
num += n1 * n2 #该C位下可组成排列的个数
return num
return fun(rating)+fun(rating[::-1])