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
三、四题暂不会,后加