动态规划1

题目:统计作战单位数
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])
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容