「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。
每日刷题第33天 2021.1.29
1996. 游戏中弱角色的数量
- leetcode原题链接:leetcode-cn.com/problems/th…
- 难度:中等
- 方法
题目
-
你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击 和 防御 。给你一个二维整数数组
properties,其中properties[i] = [attack i, defense i]表示游戏中第i个角色的属性。 -
如果存在一个其他角色的攻击和防御等级 都严格高于 该角色的攻击和防御等级,则认为该角色为 弱角色 。更正式地,如果认为角色
i弱于 存在的另一个角色j,那么attack j > attack i且defense j > defense i。 -
返回 弱角色 的数量。
示例
- 示例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 <= 105
- properties[i].length == 2
- 1 <= attack i, defense i <= 105
拓展
js中的sort函数,对二维数组的排序,可以自定义进行排序。x - y升序y - x降序
- 二维数组可以使用下标来表示,需要参考进行排序的列。
解法
- 维护最大值
max,即:防御力最大值。当前的值如果小于最大值,那么它可以是大于前面的值,也可以是小于前面的值,但是一定是小于最大值的。因为只能降序后,只需要记录小于前面防御力的值,因此小于最大值 就包含了 小于前面的值的情况。 - 对数据的处理:二维数组中按攻击力降序排序,相同攻击力的按升序排序。
- 其中相同攻击力的按升序排序,是为了避免
[[5,2],[4,3],[4,2],[2,1]]出错,此时会将[4,2]也当作弱角色。
- 其中相同攻击力的按升序排序,是为了避免
- 维护防御力的最大值,每次将当前的防御力与防御力的最大值进行比较,小于最大值,表示:当前为弱角色
- 更新防御力最大值,在每次大于最大防御力时。
/**
* @param {number[][]} properties
* @return {number}
*/
var numberOfWeakCharacters = function(properties) {
properties.sort((x, y) => {
if(y[0] == x[0]) return x[1] - y[1];
return y[0] - x[0];
});
// console.log('排序',properties);
let ans = 0;
let max = properties[0][1];
for(let i = 1; i < properties.length; i++) {
if(properties[i][1] < max){
ans++;
}
max = Math.max(max,properties[i][1]);
}
return ans;
};
总结
- 主要是思路上的变化,起初想到了攻击力降序排序,但是没有考虑到相同攻击力的进行升序排序,本质上是对排序算法书写的不熟练。
- 维护防御力最大值
max也是没有想到的,小于防御力最大值的两种情况- 大于前面的防御力,小于最大的防御力
- 小于前面的防御力,一定小于最大的防御力
- 不论当前的防御力是否 大于 或 小于 前面的防御力,都只能计算一次为“弱角色”。因此小于最大的防御力即可。