• LeetCode每日一题(1996. The Number of Weak Characters in the Game)


    You are playing a game that contains multiple characters, and each of the characters has two main properties: attack and defense. You are given a 2D integer array properties where properties[i] = [attacki, defensei] represents the properties of the ith character in the game.

    A character is said to be weak if any other character has both attack and defense levels strictly greater than this character’s attack and defense levels. More formally, a character i is said to be weak if there exists another character j where attackj > attacki and defensej > defensei.

    Return the number of weak characters.

    Example 1:

    Input: properties = [[5,5],[6,3],[3,6]]
    Output: 0

    Explanation: No character has strictly greater attack and defense than the other.

    Example 2:

    Input: properties = [[2,2],[3,3]]
    Output: 1
    Explanation: The first character is weak because the second character has a strictly greater attack and defense.

    Example 3:

    Input: properties = [[1,5],[10,4],[4,3]]
    Output: 1

    Explanation: The third character is weak because the second character has a strictly greater attack and defense.

    Constraints:

    • 2 <= properties.length <= 105
    • properties[i].length == 2
    • 1 <= attacki, defensei <= 105

    1. 根据 attack 排序, 如果 attack 相同则按 defense 的倒序排序
    2. 反向遍历,时刻记录遍历过的最大的 defense 值, 如果 properties[i][1] < max(defense)则认为 properties[i]弱于前面便利过的某个 property

    之所以 attack 相同时按 defense 的倒序排序, 是因为题目要求是 attack 和 defense 都严格小于才能算弱, 我们这样排序可以保证 attack 是不严格递增, 按 defense 倒序排序可以保证在遍历的时候可以避免误把 attack 相同的情况计入答案中


    impl Solution {
        pub fn number_of_weak_characters(mut properties: Vec<Vec<i32>>) -> i32 {
            properties.sort_by(|v1, v2| {
                if v1[0] == v2[0] {
                    return v2[1].cmp(&v1[1]);
                }
                v1[0].cmp(&v2[0])
            });
            let mut max = properties.last().unwrap()[1];
            let mut ans = 0;
            for v in properties.into_iter().rev().skip(1) {
                if v[1] < max {
                    ans += 1;
                }
                max = max.max(v[1]);
            }
            ans
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    实战纪实 | 某米企业src未授权访问
    [2022 广东省赛M] 拉格朗日插值 (多元函数极值 分治NTT)
    自动控制原理9.1---线性系统的状态空间描述(上)
    64 位条件下 C++内置类型大小区别
    ETHERNET IP站转MODBUS RTU协议网
    聚鑫数藏平台——引领数字资产管理新风向
    c++课后作业
    本地MQTT服务器搭建(EMQX)
    axios源码学习
    面经-ArrayList扩容规则
  • 原文地址:https://blog.csdn.net/wangjun861205/article/details/125426826