本文涉及的基础知识点
C++单调栈
排序
C++二分查找 的值有序
本题同解
【C++排序 双指针】1996. 游戏中弱角色的数量
LeetCode1996. 游戏中弱角色的数量
你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击 和 防御 。给你一个二维整数数组 properties ,其中 properties[i] = [attacki, defensei] 表示游戏中第 i 个角色的属性。
如果存在一个其他角色的攻击和防御等级 都严格高于 该角色的攻击和防御等级,则认为该角色为 弱角色 。更正式地,如果认为角色 i 弱于 存在的另一个角色 j ,那么 attackj > attacki 且 defensej > 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
排序+单调栈
n = roperties.length
按攻击排序,攻击最大的角色显然不是弱角色。i从大到小处理各角色。stack记录 所有大于i角色的攻击、防御。
第一步, { d = m a x ( 当前元素的防御 , 栈顶元素的防御 ) , 出栈 如果当前元素的攻击等于栈顶元素的攻击 d = 当前元素的防御 第一步,\begin{cases} d = max(当前元素的防御,栈顶元素的防御) ,出栈 && 如果当前元素的攻击等于栈顶元素的攻击 \\ d = 当前元素的防御 \\ \end{cases} 第一步,{d=max(当前元素的防御,栈顶元素的防御),出栈d=当前元素的防御如果当前元素的攻击等于栈顶元素的攻击
第二步,如果栈顶元素的防御大于当前元素的防御,则当前角色是弱角色。
第三步,如果栈为空或d大于栈顶元素的防御,则将{当前元素的攻击,d}入栈。
栈底到栈顶:攻击降序,如果防御也低于或等于栈顶防御,则当前元素被淘汰。被淘汰后,攻击降序,防御升序。
时间复杂度:O(nlogn) 瓶颈在排序
代码
核心代码
class Solution {
public:
int numberOfWeakCharacters(vector<vector<int>>& pro) {
sort(pro.begin(), pro.end());
stack<pair<int, int>> sta;
const int N = pro.size();
int ans = 0;
sta.emplace(pro.back()[0], pro.back()[1]);
for (int i = N - 2; i >= 0; i--) {
int d = pro[i][1];
if (pro[i][0] == sta.top().first) {
d = max(d, sta.top().second);
sta.pop();
}
if (sta.size() && (sta.top().second > pro[i][1])) {
ans++;
}
if( sta.empty() || ( d > sta.top().second)){
sta.emplace(pro[i][0], d);
}
}
return ans;
}
};
单元测试
vector<vector<int>> properties;
TEST_METHOD(TestMethod11)
{
properties = { {5,5},{6,3},{3,6} };
auto res = Solution().numberOfWeakCharacters(properties);
AssertEx(0, res);
}
TEST_METHOD(TestMethod12)
{
properties = { {2,2},{3,3} };
auto res = Solution().numberOfWeakCharacters(properties);
AssertEx(1, res);
}
TEST_METHOD(TestMethod13)
{
properties = { {1,5},{10,4},{4,3} };
auto res = Solution().numberOfWeakCharacters(properties);
AssertEx(1, res);
}
TEST_METHOD(TestMethod14)
{
properties = { {1,1},{2,1},{2,2},{1,2} };
auto res = Solution().numberOfWeakCharacters(properties);
AssertEx(1, res);
}
TEST_METHOD(TestMethod15)
{
properties = { {7,9},{10,7},{6,9},{10,4},{7,5},{7,10} };
auto res = Solution().numberOfWeakCharacters(properties);
AssertEx(2, res);
}