题:角色有两种属性,攻击和防御。当角色攻击和防御有严格小于某个角色时,则该角色为“弱角色”。求数组中“弱角色”个数。
解:本题可以对按攻击对数组排序,然后比较防御。记当前最大防御角色为q,当前访问的角色为p。
如果q防御>p防御,且q攻击>p攻击,那么p就是“弱角色”。
一个问题是,如何保证q防御> p防御时,q攻击 也> p攻击?
题解中给出方法,排序时按攻击降序,攻击相同时,按防御升序。
可用反证法证明:
假设:如果 q防御比p大,且q攻击和p攻击相同。
由”攻击相同时,按防御升序“可知q一定在p后面。
但是我们从前往后遍历时q一定在p前,假设错误。
class Solution: def numberOfWeakCharacters(self, properties: List[List[int]]) -> int: properties.sort(key=lambda x: (-x[0], x[1])) #攻击降序,防御升序 ans = 0 maxDef = 0 for _, def_ in properties: if maxDef > def_: ans += 1 else: maxDef = max(maxDef, def_) return ans