算法随笔_57 : 游戏中弱角色的数量

上一篇:算法随笔_56: 好子数组的最大分数-CSDN博客

=====

题目描述如下:

你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击防御 。给你一个二维整数数组 properties ,其中 properties[i] = [attacki, defensei] 表示游戏中第 i 个角色的属性。

如果存在一个其他角色的攻击和防御等级 都严格高于 该角色的攻击和防御等级,则认为该角色为 弱角色 。更正式地,如果认为角色 i 弱于 存在的另一个角色 j ,那么 attackj > attackidefensej > defensei

返回 弱角色 的数量。

示例 1:

复制代码
输入:properties = [[5,5],[6,3],[3,6]]
输出:0
解释:不存在攻击和防御都严格高于其他角色的角色。

=====

算法思路:

这道题需要比较两个属性"攻击力"和"防御力"。我们可以先对"攻击力"属性对原数组进行升序排列。那么只要前面元素的"防御力"值小于后面元素的"防御力"值,我们就找到了一个弱角色。

我们可以使用"栈"的数据结构来维护"防御力"值。我们设数组stck为此栈,初始值为 stck=properties\[01]。

当"防御力"值propertiesi1小于stck-1栈顶时,propertiesi1入栈。当propertiesi1不断大于stck-1,stck-1不断弹出。那么弹出的那些元素即为弱角色。

这道题还有一点需要注意,因为它要求严格大于。因此我们可以在排列原数组的时候,加一个限定条件,即,当元素之间的"攻击力"相同时,按"防御力"递减排列。

这样的话,如果出现元素 i 的"防御力"值大于栈顶的元素,那么这个元素 i 一定与栈顶的元素攻击力不同,且比它大。这样上面的算法就不会影响最终的结果。

下面是代码实现:

复制代码
class Solution(object):
    def numberOfWeakCharacters(self, properties):
        """
        :type properties: List[List[int]]
        :rtype: int
        """
        p_len=len(properties)
        properties.sort(key=lambda x: (x[0], -x[1]))
        stck=[properties[0][1]]
        res=0
        for i in range(1, p_len):
            while stck and properties[i][1]>stck[-1]:
                res+=1
                stck.pop()   
            stck.append(properties[i][1])
        return res

关键词: 单调栈

相关推荐
傻啦嘿哟6 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670796 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
2601_962077606 小时前
python Dejavu库快速识别音频指纹实例探究
python·音乐识别·dejavu库·音频指纹识别·实例探究
Dola_Zou6 小时前
工厂智能排产软件算法保护与按产线计费实战
算法·自动化·软件工程·软件加密
科技苑6 小时前
如何用Python编程实现一个简单的Web爬虫?
人工智能·python
dayDayupbetter7 小时前
Visual C++ 2010安装与使用高手秘籍
python
隐擎fox7 小时前
深入理解网络传输层安全:TLS 指纹识别(JA3/JA4)原理与 Python 协议层检测实战
爬虫·python·网络协议·安全·网络安全·https
医疗信息化王工7 小时前
DataForge:基于 Python 的数据库批量导出 Excel 工具——从架构到部署的全流程实战
数据库·python·excel
啦啦啦啦啦zzzz7 小时前
Logger的组装(c++20)
c++·算法·c++20
小玮看世界8 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python