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数据是如何序列化成二进制的,考虑到现在在手游中 ...
随机推荐
- Ubuntu系统安装搜狗拼音输入法
问题背景 Ubuntu是使用人数最多的Linux发行版之一,其丰富的生态广受各位种花家程序员小伙伴们的欢迎.对种花家小伙伴们来说,最重要的功能之一就是中文输入法了.但是Ubuntu自带的中文输入法效果 ...
- FMC子卡设计资料原理图:FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡
FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡 一.产品概述 ADRV9002 是一款高性能.高线性度.高动态范围收发器,旨在针对性能与功耗系统进行优化.该设备是可配置的,非常适合要 ...
- 你不能只会flex居中布局,精制动画讲解所有flex布局方式!通俗易懂纯干货教程!...
flex布局相信很多人都已经有不少了解,其优势和作用被越来越多的开发者所喜爱,网上也有很多关于关于flex的介绍和教程.但是根据笔者的面试经验发现,很多人尤其是初中级开发者对flex布局都仅仅停留下c ...
- 配置python库源为清华源
目录 Windows Ubuntu pip较低版本 pip较高版本 Windows %HOMEPATH%/pip/pip.ini [global] index-url = https://pypi.t ...
- leecode64. 最小路径和(动态规划)
64. 最小路径和 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例 1: 输入:gri ...
- 最大流模板(EK,Dinic
一.EK EK算法:用bfs找增广路直到找不到为止.找到则更新最大流和残余网络,找不到则结束. 残余网络:对于一条走过的边,其正向边权值减少相应值,反向边权值增加相应值(用于反悔). 增广路:从所求起 ...
- C# 窗口全屏、置顶、获取焦点
很简单的几行代码 this.FormBorderStyle = FormBorderStyle.None; //设置窗体为无边框样式 this.WindowState = FormWindowStat ...
- golang windows程序获取管理员权限(UAC )
在windows上执行有关系统设置命令的时候需要管理员权限才能操作,比如修改网卡的禁用.启用状态.双击执行是不能正确执行命令的,只有右键以管理员身份运行才能成功.为解决此问题,花了很长时间找了各种方法 ...
- el-tree 点击父级或者父级的checkbox,展开所有子集
<el-tree :data="authData" show-checkbox :check-strictly="true" :check-on-clic ...
- 7.29-bug计算器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...