每日一题 0128
(2022.01.28)每日一题 游戏中弱角色的数量
今日,觉得自己太菜了。
需要注意sort的用法以及分组的思想,组内和组外的筛选很重要。通过排序尽可能丰富信息,有助于后面的解题。
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 maxDef = 0;
int res =0;
for(auto& temp : properties){
if(temp[1]<maxDef){
res++;
}else{
maxDef = temp[1];
}
}
return res;
}
// 单调递增栈的算法
// 根据攻击力的单调递增进行排序,当攻击力相同时,防御力递减排序,然后依据攻击力递增的顺序,将防御力压栈。
// 若后面进栈的防御力大于栈顶元素,则栈顶出栈,直至新元素的防御力不大于栈顶元素,新元素防御力入栈。
// 也是分组的思想,就让别的组的更大的防御力去筛选弱角色,攻击力大的情况下,防御力也大就可以横扫了
// 只能靠别的组的防御力去筛选,同组内不能筛选,所以要组内防御力递减
sort(properties.begin(),properties.end(),[](vector<int>& a,vector<int>& b){
return (a[0]==b[0])? a[1]>b[1]:a[0]<b[0];
});
stack<int> st;
int res = 0;
for(auto& temp: properties){
while(!st.empty() && st.top()<temp[1]){
res++;
st.pop();
}
st.push(temp[1]);
}
return res;
}
};

浙公网安备 33010602011771号