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

..
 
 

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

Similar Questions:

Solution 1. Sorting

// OJ: https://leetcode.com/problems/the-number-of-weak-characters-in-the-game/
// Author: github.com/lzl124631x
// Time: O(NlogN)
// Space: O(N)
class Solution {
public:
    int numberOfWeakCharacters(vector<vector<int>>& A) {
        sort(begin(A), end(A), [](auto &a, auto &b) { return a[0] < b[0]; });
        multiset<int> s;
        for (auto &a : A) s.insert(a[1]);
        int N = A.size(), ans = 0;
        for (int i = 0; i < N; ) {
            vector<int> ds;
            int at = A[i][0];
            while (i < N && A[i][0] == at) {
                ds.push_back(A[i][1]);
                s.erase(s.find(A[i][1]));
                ++i;
            }
            for (int d : ds) {
                ans += s.upper_bound(d) != s.end();
            }
        }
        return ans;
    }
};

Solution 2. LIS

Similar to 354. Russian Doll Envelopes (Hard)

// OJ: https://leetcode.com/problems/the-number-of-weak-characters-in-the-game/
// Author: github.com/lzl124631x
// Time: O(NlogN)
// Space: O(N)
class Solution {
public:
    int numberOfWeakCharacters(vector<vector<int>>& A) {
        sort(begin(A), end(A), [](auto &a, auto &b) { return a[0] != b[0] ? a[0] > b[0] : a[1] < b[1]; });
        vector<int> dp;
        int ans = 0;
        for (auto &c : A) {
            int i = lower_bound(begin(dp), end(dp), c[1], greater<>()) - begin(dp);
            if (i == dp.size()) dp.emplace_back();
            dp[i] = c[1];
            ans += i > 0;
        }
        return ans;
    }
};

TODO

Use Bucket Sort. Work on O(N) solution.