leetcode每日一题-游戏中弱角色的数量
这篇题解用“排序 + 一次遍历”解决弱角色计数问题,核心价值在于排序细节对正确性的决定性作用。问题与判定条件每个角色有攻击和防御两个属性。若存在另一角色同时在攻击与防御上都更高,则该角色为“弱角色”。目标是统计所有弱角色数量。核心算法先按攻击力降序排序,攻击力相同则按防御力升序排序。之后线性扫描数组,维护遍历过元素中的…
题目 题目链接 解题思路 一句话解决:以第一个字段为标准从大到小排序,然后再遍历数组,对比第二字段的最大值即可。 关键细节: 为了避免第一个字段相同的情况下被更新,所以在排序时采取,攻击力降序防御力升序的方式(关键)来进行。 这样就让第一个字段相同时,按照从左到右的遍历顺序是不可能把第一个字段相同的情况拿来更新 cnt 。解题代码 注意:golang 的代码中的断言型函数接口有点不一样。。它调用时用的是数组下标的形式来调用。 cpp versionclass 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 versionclass 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 versionfunc 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 } 收获被坑了,往二分+哈希表方向去写了。完全没想到之间排序+遍历就能解决。。。 排序的处理非常之精髓。
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行