1996. 游戏中弱角色的数量 (Medium)
问题描述
你正在参加一个多角色游戏,每个角色都有两个主要属性: 攻击 和 防御 。给你一个二维整数数组
properties
,其中 properties[i] = [attackᵢ, defenseᵢ]
表示游戏中第 i
个角色的属性。
如果存在一个其他角色的攻击和防御等级 都严格高于 该角色的攻击和防御等级,则认为该角色为 弱角色
。更正式地,如果认为角色 i
弱于 存在的另一个角色 j
,那么 attackⱼ > attackᵢ
且 defenseⱼ > defenseᵢ
。
返回 弱角色 的数量。
示例 1:
输入:properties = [[5,5],[6,3],[3,6]]
输出:0
解释:不存在攻击和防御都严格高于其他角色的角色。
示例 2:
输入:properties = [[2,2],[3,3]]
输出:1
解释:第一个角色是弱角色,因为第二个角色的攻击和防御严格大于该角色。
示例 3:
输入:properties = [[1,5],[10,4],[4,3]]
输出:1
解释:第三个角色是弱角色,因为第二个角色的攻击和防御严格大于该角色。
提示:
2 <= properties.length <= 10⁵
properties[i].length == 2
1 <= attackᵢ, defenseᵢ <= 10⁵
解题思路
首先将角色按照攻击值从大到小排序,至于相同攻击值之间的角色的排序,有两种思路
按照防御值从大到小排序
利用哈希表记录每个攻击值有多少攻击值相同的角色,遍历排好序的properties
数组时,从i = 1, j= roles[properties[i][0]]
开始遍历,一直到j == i + roles[properties[i][0]]
,此时++i; j = roles[properties[i + 1][0]]
,角色的攻击值一定是相对较小的,如果角色的防御值小于记录的防御值最大值,那么i + roles[properties[i][0]]] - j
就是本次i
循环中发现的弱角色的数量,否则更新防御最大值defend_max
.
按照防御值从小到大排序
直接遍历排好序的properties
数组,如果properties[i][0] < properties[0][0] && properties[i][1] < defend_max
, res++
;如果properties[i][1] > defend_max
,更新defend_max
.
代码
按照防御值从大到小排序
class Solution {
public:
int numberOfWeakCharacters(vector<vector<int>> &properties) {
std::sort(properties.begin(), properties.end(), [&](vector<int> &vec1, vector<int> &vec2) {
if (vec1[0] == vec2[0])
return vec1[1] >= vec2[1];
return vec1[0] > vec2[0];
});
int cnt = 0;
int attack_max = properties[0][0];
int defend_max = properties[0][1];
unordered_map<int, int> roles; // 记录同一攻击值有多少角色
for (int i = 0; i < properties.size(); i++) {
roles[properties[i][0]]++;
}
for (int i = roles[attack_max]; i < properties.size(); i += roles[properties[i][0]]) {
int j = i;
while (j < i + roles[properties[i][0]] && properties[j][1] >= defend_max) {
j++; // 寻找小于defend_max的properties[j][1]
}
cnt += i + roles[properties[i][0]] - j;
defend_max = std::max(defend_max, properties[i][1]); // 更新defend_max
}
return cnt;
}
};
按照防御值从小到大排序
class Solution {
public:
int numberOfWeakCharacters(vector<vector<int>> &properties) {
std::sort(properties.begin(), properties.end(), [&](vector<int> &vec1, vector<int> &vec2) {
if (vec1[0] == vec2[0])
return vec1[1] <= vec2[1];
return vec1[0] > vec2[0];
});
int cnt = 0;
int attack_max = properties[0][0];
int defend_max = properties[0][1];
for (int i = 1; i < properties.size(); i++) {
if (properties[i][0] < attack_max && properties[i][1] < defend_max) {
cnt++;
} else if (properties[i][1] > defend_max) {
defend_max = properties[i][1];
}
}
return cnt;
}
};
1996. 游戏中弱角色的数量 (Medium)的更多相关文章
- 问题 C: P4 游戏中的Human角色
题目描述 在一个平面打斗游戏中,任何的角色(Role)都有血量(blood)和位置loc(此处loc是Location类的实例)属性.有了Role类,可以派生出不同的角色,如人.神仙.怪兽等.如下程序 ...
- YTU 2635: P4 游戏中的Human角色
2635: P4 游戏中的Human角色 时间限制: 1 Sec 内存限制: 128 MB 提交: 524 解决: 328 题目描述 在一个平面打斗游戏中,任何的角色(Role)都有血量(bloo ...
- Unity优化方向——优化Unity游戏中的图形渲染(译)
CPU bound:CPU性能边界,是指CPU计算时一直处于占用率很高的情况. GPU bound:GPU性能边界,同样的是指GPU计算时一直处于占用率很高的情况. 原文:https://unity3 ...
- UE4蓝图与C++交互——射击游戏中多武器系统的实现
回顾 学习UE4已有近2周的时间,跟着数天学院"UE4游戏开发"课程的学习,已经完成了UE4蓝图方面比较基础性的学习.通过UE4蓝图的开发,我实现了类似CS的单人版射击游戏,效 ...
- 喵的Unity游戏开发之路 - 推球:游戏中的物理
很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...
- 游戏中的人工智能——初探AI
一.游戏中的人工智能 让游戏具有挑战性: 让游戏好玩的关键因素是为之找到合适的难度等级: 人工智能在游戏中的作用是通过提供富有挑战性的竞争对象来让游戏更好玩,而在游戏中行动逼真的非玩家角色(NPC), ...
- 《MFC游戏开发》笔记十 游戏中的碰撞检测进阶:地图类型&障碍物判定
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9394465 作者:七十一雾央 新浪微博:http:// ...
- 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...
- 论游戏中Buff的实现 [转]
论游戏中Buff的实现 分类: C/C++ 游戏开发2012-09-13 14:30 574人阅读 评论(6) 收藏 举报 c++游戏开发 源地址:http://blog.codingnow.com/ ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)
本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中 ...
随机推荐
- 部署spingboot项目到云服务器踩坑记录
按教程部署mall电商系统 https://www.macrozheng.com/mall/deploy/mall_deploy_docker.html#docker环境安装 只记录SpringBoo ...
- @Column和@Select使用测试
1.@Select(select * from X ) /** * goods_level 0 商品等级, */@Column(name = "goods_level")priva ...
- react框架-知识点(ref,, setState)
react的思想:无必要勿增实体 1. ref 使用 myRef = React.createRef() <input ref={this.myRef}></input> 2. ...
- pyqt5中文教程
本文转载自:http://code.py40.com/pyqt5/ 一.PyQt5基本功能 简单的例子 PyQt5是一种高级的语言,下面只有几行代码就能显示一个小窗口.底层已经实现了窗口的基本功能. ...
- 使用Libusb测试USB device
一. 先准备好测试工具 -- Libusb: 在Linux中使用的话: 首先从 http://www.libusb.org/官网中下载libusb 然后解压之后./configure --> m ...
- 一种改进后的turf.idw算法
turf 是Advanced geospatial analysis geojson data in javascript. 官网:http://turfjs.org/ 针对github 中的源码. ...
- 12组-Beta冲刺-3/5
一.基本情况 队名:字节不跳动 组长博客:https://www.cnblogs.com/147258369k/p/15599024.html Github链接:https://github.com/ ...
- 浅谈AD域
活动目录(Active Directory)是面向Windows Standard Server.Windows Enterprise Server以及 Windows Datacenter Serv ...
- 关于windows更新时间,设置更新时间段
https://jingyan.baidu.com/article/bad08e1eda412f09c85121c6.html https://www.dadighost.com/help/39372 ...
- JAVA框架知识
Java中的MVC: M是指模型层,C则是控制器,V是指视图:一个完整的请求过程是,客户端发送请求到控制器,控制器调用业务层处理请求,并返回处理结果给视图,其中业务层是调用Dao层去完成业务逻辑的:M ...