Skip to content

Latest commit

 

History

History

1996.The Number of Weak Characters in the Game

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 

English Version

题目描述

你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击防御 。给你一个二维整数数组 properties ,其中 properties[i] = [attacki, defensei] 表示游戏中第 i 个角色的属性。

如果存在一个其他角色的攻击和防御等级 都严格高于 该角色的攻击和防御等级,则认为该角色为 弱角色 。更正式地,如果认为角色 i 弱于 存在的另一个角色 j ,那么 attackj > attackidefensej > defensei

返回 弱角色 的数量。

 

示例 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 <= attacki, defensei <= 105

解法

按攻击力从大到小排序,攻击力相同则按防御力从小到大排序。

遍历,维护遍历过的角色的防御的最大值 mx。

对于当前角色 p,如果 p 的防御小于 mx,说明前面有防御比 p 高的角色,记作 q。根据上面的排序规则,q 的攻击是大于或等于 p 的攻击的,如果 q 和 p 攻击相同,仍然根据上面的排序规则,q 的防御不会超过 p,矛盾,因此 q 的攻击必然大于 p,于是 q 的攻防均高于 p,p 是一个弱角色。

Python3

class Solution:
    def numberOfWeakCharacters(self, properties: List[List[int]]) -> int:
        properties.sort(key=lambda x: (-x[0], x[1]))
        ans = mx = 0
        for _, d in properties:
            if mx > d:
                ans += 1
            mx = max(mx, d)
        return ans

Java

class Solution {
    public int numberOfWeakCharacters(int[][] properties) {
        Arrays.sort(properties, (a, b) -> { return a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]; });
        int ans = 0, mx = 0;
        for (int[] p : properties) {
            if (mx > p[1]) {
                ++ans;
            }
            mx = Math.max(mx, p[1]);
        }
        return ans;
    }
}

TypeScript

function numberOfWeakCharacters(properties: number[][]): number {
    properties.sort((a, b) => (a[0] != b[0] ? b[0] - a[0] : a[1] - b[1]));

    let ans = 0;
    let max = 0;
    for (let [, b] of properties) {
        if (b < max) {
            ans++;
        } else {
            max = b;
        }
    }
    return ans;
}

C++

class Solution {
public:
    int numberOfWeakCharacters(vector<vector<int>>& properties) {
        sort(properties.begin(), properties.end(), [&](vector<int>& a, vector<int>& b) { return a[0] == b[0] ? a[1] < b[1] : a[0] > b[0]; });
        int ans = 0, mx = 0;
        for (auto& p : properties) {
            if (mx > p[1])
                ++ans;
            else
                mx = p[1];
        }
        return ans;
    }
};

Go

func numberOfWeakCharacters(properties [][]int) int {
	sort.Slice(properties, func(i, j int) bool {
		if properties[i][0] == properties[j][0] {
			return properties[i][1] < properties[j][1]
		}
		return properties[i][0] > properties[j][0]
	})
	ans, mx := 0, 0
	for _, p := range properties {
		if mx > p[1] {
			ans++
		} else {
			mx = p[1]
		}
	}
	return ans
}

...