题目链接
思路:排序+组内排序
分析:按照题目的意思,如果有一个角色,攻击值和防守值都小于另一个角色,那么这个角色就是弱角色。
首先,要两个值都小于另一个角色,那么起码一个值要小于另一个角色吧,好的,那么我们首先按照一个值降序排列,这里我选择了攻击值,也就是说,前面的攻击值肯定大。
其次,如果我们把攻击值相同的看成一个组,那么从这个组里面选出防守值最大的,那么下一个组的防守值小于这个组的最大防守值得肯定就是弱角色。因为下一组得攻击值肯定比这个组小,因为我们一开始按照攻击值降序排列得。
但是目前有个问题,就是如何更新这个最大得防御值,也就是说要比完一组并且当前组要有更大得防御值,才更新这个防御值。那么如何更新?
这里有很多方法可以去实现更新,我这里使用得依然是排序,就是组内排序,也就是在攻击值相同得一组内,对防御值进行升序排序。那么如果遍历properties
如果出现了防御值小于前面的,那么肯定是下一组了,那么可以直接统计答案。
如果出现了防御值大于前面的,那么就更新最大防御值。此时可能是下一组也可能是本组。这个倒不要紧。
如下图:
代码:
class Solution {
public int numberOfWeakCharacters(int[][] properties) {
Arrays.sort(properties, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0]-o2[0]==0){//攻击相同
//防御升序
return o1[1]-o2[1];
}
//否则 攻击降序
return o2[0]-o1[0];
}
});
int res = 0;
int maxDef = properties[0][1];
for(int i = 1; i< properties.length;i++){
if(maxDef>properties[i][1]){
//说明当前肯定是maxDef的后面的组,也就是攻击值已经确定了当前是小于前面的
res++;
}else{
maxDef = properties[i][1];
}
}
return res;
}
}
好好学习。
不打扰是我的温柔。