力扣1996. 游戏中弱角色的数量
题目中对于弱角色的定义是:如果存在一个其他角色的攻击和防御均高于该角色,则这个角色是弱角色。我的想法是用哈希表的键来存储攻击力,哈希表的值用一个列表存放防御力,然后根据攻击力进行排序,并记录当前最高的防御力。由于攻击力已经按从大到小排好,那么找弱角色的逻辑就是只要这个角色的防御力比最大防御力小(伤害溢出),就满足弱角色,计数加一。
from typing import List
from collections import defaultdict
def numberOfWeakCharacters(properties: List[List[int]]) -> int:
res = 0
prop_map = defaultdict(list)
max_defence = 0
# {攻击力:[防御力,]}
for attack, defence in properties:
prop_map[attack].append(defence)
# 按攻击力对哈希表排序
for attack in sorted(prop_map, reverse=True):
for defence in prop_map[attack]:
if defence < max_defence:
res += 1
# 维护最大防御力
max_defence = max(max_defence, max(prop_map[attack]))
return res
properties = [[1, 5], [10, 4], [4, 3], [1, 2]]
print(numberOfWeakCharacters(properties)) # 2
还可以使用排序+双指针来实现,先给properties安排一波原地排序,按攻击力和防御力由大到小。一个指针用来遍历角色并维护当前遍历到的攻击力(之前最高的防御力),另一个指针维护与第一个指针攻击力相同的怪的防御力(当前攻击力下的防御力),统计弱角色的个数。
def double_pointer_solution(properties: List[List[int]]) -> int:
properties.sort(key=lambda x: (-x[0], -x[1])) # 按攻击力由大到小,按防御力由大到小
res = 0
max_defence = 0
i = 0
while i < len(properties): # i指针遍历角色的攻击力
j, cur_max, max_defence = i, max_defence, max(
max_defence, properties[i][1]) # 取当前最大防御力和该角色防御力间的最大值
# j指针在攻击力相等的情况维护当前攻击力下的防御力
while j < len(properties) and properties[j][0] == properties[i][0]:
if properties[j][1] < cur_max:
res += 1 # 满足伤害溢出
j += 1
i = j
return res
properties = [[1, 5], [10, 4], [4, 3], [1, 2]]
print(double_pointer_solution(properties)) # 2
END