数组、排序、空间、[1996] 游戏中弱角色的数量

排序 + 属性分离

// 1996. 游戏中弱角色的数量
class Solution {
    public int numberOfWeakCharacters(int[][] properties) {

        Arrays.sort(properties, (i1, i2)->{
            // 比较攻击力,如果攻击力不相等则返回返回攻击力的差值,整体攻击力按从小到大的顺序
            // 如果攻击力相等的情况下,返回防御力的差值,整体的防御力按从大到小的顺序
           return i1[0] == i2[0] ? i2[1] - i1[1] : i1[0] - i2[0]; 
        });

        // 记录当前最大的防御力
        int maxDef = -1;

        // 返回结果
        int ans = 0;

        // 从右向左遍历,也就是先遍历攻击力大的元素,按照上面的排序规则,如果攻击力相同,由于防御力是按照从大到小排序的,所以,不会记录攻击力相同,防御力大的元素。
        for(int i = properties.length - 1; i >= 0; i--){
            int nowDef = properties[i][1];

            if(maxDef > nowDef){
                // 当前元素的防御力小于最大的防御力(这里已经默认保证了攻击力的大小)
                ans++;
                continue;
            }

            // 记录当前的最大防御力
            maxDef = Math.max(maxDef, nowDef);
        }

        return ans;
    }
}

空间换时间 

// 1996. 游戏中弱角色的数量
class Solution {
    public int numberOfWeakCharacters(int[][] properties) {
                // 获取最大攻击
        int maxAttack = -1;
        for (int i = 0; i < properties.length; i++) {
            maxAttack = Math.max(maxAttack, properties[i][0]);
        }

        // 下标对应攻击值
        // 具体值对应在properties中该攻击值的最大防御值
        // maxAttack + 2 可以方便的在最后获取计算结果
        int[] bucket = new int[maxAttack + 2];

        // 设置bucket中下标对应的最大防御值
        for (int i = 0; i < properties.length; i++) {
            bucket[properties[i][0]] = Math.max(bucket[properties[i][0]], properties[i][1]);
        }

        // 最大防御值
        // int maxDef = bucket[maxAttack]
        // 这里bucket[maxAttack] 其实为 0
        int maxDef = 0;
        // maxAttack == bucket.length - 2 : 这里的意思是跳过最后一个元素,这个元素只是为了方便最后计算ans
        for (int i = maxAttack; i >= 0; i--) {
            if(maxDef > bucket[i]){
                // 获取当前攻击值可以获取的 大于其攻击值的最大防御值
                bucket[i] = maxDef;
            }else{
                // 获取当前的最大防御值
                maxDef = bucket[i];
            }
        }

        int ans = 0;
        for (int i = 0; i < properties.length; i++) {
            // 当前下标对应的攻击值在bucket中的下一个位置对应的值,即为大于该攻击值的最大防御值
            // 如果符合则说明是弱将
            if(bucket[properties[i][0] + 1] > properties[i][1])
                ans++;
        }

        return ans;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值