1996. 游戏中弱角色的数量

212 阅读2分钟

「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。

每日刷题第33天 2021.1.29

1996. 游戏中弱角色的数量

题目

  • 你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击 和 防御 。给你一个二维整数数组 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也是没有想到的,小于防御力最大值的两种情况
    • 大于前面的防御力,小于最大的防御力
    • 小于前面的防御力,一定小于最大的防御力
  • 不论当前的防御力是否 大于 或 小于 前面的防御力,都只能计算一次为“弱角色”。因此小于最大的防御力即可。