目录

leetcode每日一题-游戏中弱角色的数量


题目

题目链接

https://s2.loli.net/2022/01/28/b2deiZPru7cSxvM.png

解题思路

一句话解决:以第一个字段为标准从大到小排序,然后再遍历数组,对比第二字段的最大值即可。

关键细节

为了避免第一个字段相同的情况下被更新,所以在排序时采取,攻击力降序防御力升序的方式(关键)来进行。

这样就让第一个字段相同时,按照从左到右的遍历顺序是不可能把第一个字段相同的情况拿来更新 cnt

解题代码

注意:golang 的代码中的断言型函数接口有点不一样。。它调用时用的是数组下标的形式来调用。

cpp version

class Solution {
public:
//一句话解决:以第一个字段为标准从大到小排序,然后再遍历数组,对比第二字段的最大值即可。
//但为了避免第一个字段相同的情况下被更新,所以在排序时采取,攻击力降序防御力升序的方式(关键)来进行
//这样就让第一个字段相同时,按照从左到右的遍历顺序是不可能把第一个字段相同的情况拿来更新cnt。
    int numberOfWeakCharacters(vector<vector<int>>& properties) {
        int n = properties.size();
        auto cmp =  [](vector<int>& t1,vector<int>&t2){return t1[0]==t2[0]?t1[1]<t2[1]:t1[0]>t2[0];};
        sort(properties.begin(),properties.end(),cmp);
        int mx = INT_MIN;
        int cnt = 0;
        for(int i=0;i<n;i++){
            if(mx>properties[i][1])
                cnt++;
            mx = max(mx,properties[i][1]);
        }
        return cnt;
    }
};

java version

class Solution {
    public int numberOfWeakCharacters(int[][] properties) {
        Arrays.sort(properties,(o1,o2)-> o1[0]==o2[0]?o1[1]-o2[1]:o2[0]-o1[0]);
        int max = -1,cnt = 0;
        for(int[] p : properties){
            if(p[1]<max)
                cnt++;
            max = Math.max(max,p[1]);
        }
        return cnt;
    }
}

golang version

func numberOfWeakCharacters(properties [][]int) int {
    sort.Slice(properties,func (i int,j int) bool{//注意这个接口被写死只能用int型
        p, q := properties[i], properties[j]
        return p[0] > q[0] || p[0] == q[0] && p[1] < q[1]
    })
    var max = -1
    cnt := 0
    for _,v := range properties{
        if max>v[1] {
            cnt++
        }
        max = int(math.Max(float64(max), float64(v[1])))
    }
    return cnt
}

收获

  • 被坑了,往二分+哈希表方向去写了。完全没想到之间排序+遍历就能解决。。。

排序的处理非常之精髓