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 == 21 <= 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数据是如何序列化成二进制的,考虑到现在在手游中 ...
随机推荐
- FMC子卡设计资料原理图:FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡
FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡 一.产品概述 ADRV9002 是一款高性能.高线性度.高动态范围收发器,旨在针对性能与功耗系统进行优化.该设备是可配置的,非常适合要 ...
- Windows11使用WSL Ubuntu搭建paddle的GPU环境
Windows11使用WSL Ubuntu搭建paddle的GPU环境 最近升级到了Windows11,突然有个大胆的想法:在Windows11上安装WSL,将所有开发环境安装到WSL中.这样就能在w ...
- Svelte
Svelte Svelte 简介 在最新的<State of JS survey of 2020>中,它被预测为未来十年可能取代React和Vue等其他框架的新兴技术.如果你不确定自己是否 ...
- css节流
众所周知,函数节流(throttle)是 JS 中一个非常常见的优化手段,可以有效避免函数过于频繁的执行. 举个例子:一个保存按钮,为了避免重复提交或者服务器考虑,往往需要对点击行为做一定的限制,比如 ...
- mysql函数实现oracle的序列
1.创建一张伪序列表 CREATE TABLE sequence ( seq_name VARCHAR (50) NOT NULL,-- 序列名称 current_val INT NOT NULL,- ...
- 【Go】发送请求
发送post请求 reqMap := make(map[string]interface{}) reqMap["order_num"] = request.OutTradeNo r ...
- 关于CMDB
关于CMDB: CMDB运维管理平台是由CMDB开发团队,针对目前服务器运维.监控,批量管理提出的一个开源. 易用.实用的跨平台服务器运维管理平台. 统筹来说cmdb就是将已有的规则化运维技术规则到运 ...
- (0501)phase机制
(1)启动seq: (2) 0312:
- Nginx教程由浅入深
Nginx 一.安装Nginx 1.准备工作 (1)打开虚拟机,使用远程连接工具连接 linux 操作系统 (2)到 nginx 官网下载软件 http://nginx.org/ 2.开始进行 n ...
- acl规则问题
在acl规则中网络地址与广播地址包含在规则范围内