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数据是如何序列化成二进制的,考虑到现在在手游中 ...
随机推荐
- Codeforces 1492D、Genius's Gambit
原题网址 https://codeforces.com/contest/1492/problem/D 题目大意 给定a,b,k,求x,y使得x和y的二进制表示都恰有a个0和b个1,且不能使用开头的0. ...
- Vue CLI 2内置框架webpack框架结构解析
目前Vue已经到3.X版本,相应的Vue CLI也已经是Vue CLI 3版本,创建命令使用vue create,如果要用2.X版的vue init命令,需要全局安装一个桥接工具: npm insta ...
- 报错:cannot import name ‘escape’ from ‘jinja2’
jinja2版本问题导致 解决方法: 降低版本即可 pip3 install Jinja2==3.0.3 -U pip3 install werkzeug==2.0.3 -U jinja2介绍 jin ...
- Mybatis 中传入List实现 批量插入、批量更新、批量删除
1. 批量插入: Mapper层: int insertList(List<UsersModel> list); 对应的mapper.xml: <!--批量插入信息--> &l ...
- PHP 执行系统命令解压7z格式压缩包
银行推送的账单是7z格式的压缩包,需要用程序对账单进行解压,网上关系PHP解压7z格式压缩包的资料很少 现在分享下处理过程,首先安装7-zip软件,我是在windows环境下调试的,下载地址https ...
- io流转换为Multipart文件
io流转换为Multipart文件 个人的话是运用到了minio文件服务器保存文件,前端(vue)异步上传文件后,由于要提升用户体验效果,先上传文件到后台服务器,返回视频在文件服务器的link()参数 ...
- VUE+Element+若依随笔001:点击左侧菜单跳转外部链接配置并传参数
一.后台菜单配置部分:1.菜单管理中:新增父级目录2.配置内容: 菜单名称:测试用菜单 菜单路径:https://www.baidu.com/ 此处需要配置要跳转你的外部链接 组件名称:testMen ...
- docker 搭建minio
minio为开源的高可用分部署对象存储服务组件,已经提供了分布式部署的解决方案,实现高可靠.高可用的资源存储,MinIO以极简主义为指导进行设计,追求极致的维护精简性和卓越的读写性能表现. -dock ...
- js原生判断数字类型
js判断数字类型汇总最近在写代码的时候,有些逻辑需要判断数字类型,等用到的时候才发现自己了解的方法不太严密,然后就决心查资料汇总了解下有哪些方法比较严密 第一种:typeof + isNaN使用typ ...
- uniapp输入空格
uniapp 密码框输入空格(去除空格)的时候一直回显不及时 经过一番折腾 终于搞定 1.先赋值: this.pwd = e.detail.value 2. 使用setTimeout(再 ...