天天看点

leetcode周赛182leetcode周赛182

leetcode周赛182

5368. 找出数组中的幸运数

题意

在整数数组中,如果一个整数的出现频次和它的数值大小相等,我们就称这个整数为「幸运数」。

给你一个整数数组 arr,请你从中找出并返回一个幸运数。

如果数组中存在多个幸运数,只需返回 最大 的那个。
如果数组中不含幸运数,则返回 -1 。
           

解题思路

先排序;后计数判断并将所有幸运数收集;返回最大的幸运数
           

代码

class Solution:
    def findLucky(self, arr: List[int]) -> int:
        if len(arr)==1 and arr[0]==1:
            return 1
        
        res=[]#幸运数处理
        arr=sorted(arr)#排序   
        flag=1#计数器
        for i in range(len(arr)-1):
            if arr[i]!=arr[i+1]:
                if arr[i]==flag:
                    res.append(flag)#找到幸运数
                flag=1
            else:
                flag +=1
                
        #最后一个元素的处理        
        l=len(arr)
        if arr[l-1]==arr[l-2]:
            if flag==arr[l-1]:
                res.append(flag)
        else:
            if arr[l-2]==flag:
                res.append(flag)
            if arr[l-1]==1:
                res.append(1)
                
                
        if len(res)==0:
            return -1
        return res[len(res)-1]
           

5369. 统计作战单位数

题意

1.n 名士兵站成一排。每个士兵都有一个 独一无二 的评分 rating 。

2.每3个士兵可以组成一个作战单位,分组规则如下:

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
	请你返回按上述条件可以组建的作战单位数量。每个士兵都可以是多个作战单位的一部分。
           

解题思路

题目要求找到按数组原序递增和递减的三元组个数,可以:
	递减:元素左边大于自己的个数×右边小于自己的个数
	递增:元素左边小于自己的个数×右边大于自己的个数
           

代码

class Solution:
    def numTeams(self, rating: List[int]) -> int:
        res=0
        l=len(rating)
        if l<3:
            return res
        
        for i in range(l-1):
            '''high和slow为计数器,分别计算大于自己和小于自己的元素的个数'''
            high=0 
            slow=0
            for j in range(l):
                if j>i and rating[j]>rating[i]:#右大
                    high +=1
                if j<i and rating[j]<rating[i]:#左小
                    slow +=1
            res += slow*high#递增三元组个数
            high=0
            slow=0
            for j in range(l):
                if j>i and rating[j]<rating[i]:#右小
                    slow +=1
                if j<i and rating[j]>rating[i]:#左大
                    high +=1
            res += slow*high#递减三元组个数
        return res
           

三、四题暂不会,后加

继续阅读