每日一题 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;
      }
};
posted @ 2022-01-28 15:07  kusola  阅读(48)  评论(0)    收藏  举报