排序 + 属性分离
// 1996. 游戏中弱角色的数量
class Solution {
public int numberOfWeakCharacters(int[][] properties) {
Arrays.sort(properties, (i1, i2)->{
// 比较攻击力,如果攻击力不相等则返回返回攻击力的差值,整体攻击力按从小到大的顺序
// 如果攻击力相等的情况下,返回防御力的差值,整体的防御力按从大到小的顺序
return i1[0] == i2[0] ? i2[1] - i1[1] : i1[0] - i2[0];
});
// 记录当前最大的防御力
int maxDef = -1;
// 返回结果
int ans = 0;
// 从右向左遍历,也就是先遍历攻击力大的元素,按照上面的排序规则,如果攻击力相同,由于防御力是按照从大到小排序的,所以,不会记录攻击力相同,防御力大的元素。
for(int i = properties.length - 1; i >= 0; i--){
int nowDef = properties[i][1];
if(maxDef > nowDef){
// 当前元素的防御力小于最大的防御力(这里已经默认保证了攻击力的大小)
ans++;
continue;
}
// 记录当前的最大防御力
maxDef = Math.max(maxDef, nowDef);
}
return ans;
}
}
空间换时间
// 1996. 游戏中弱角色的数量
class Solution {
public int numberOfWeakCharacters(int[][] properties) {
// 获取最大攻击
int maxAttack = -1;
for (int i = 0; i < properties.length; i++) {
maxAttack = Math.max(maxAttack, properties[i][0]);
}
// 下标对应攻击值
// 具体值对应在properties中该攻击值的最大防御值
// maxAttack + 2 可以方便的在最后获取计算结果
int[] bucket = new int[maxAttack + 2];
// 设置bucket中下标对应的最大防御值
for (int i = 0; i < properties.length; i++) {
bucket[properties[i][0]] = Math.max(bucket[properties[i][0]], properties[i][1]);
}
// 最大防御值
// int maxDef = bucket[maxAttack]
// 这里bucket[maxAttack] 其实为 0
int maxDef = 0;
// maxAttack == bucket.length - 2 : 这里的意思是跳过最后一个元素,这个元素只是为了方便最后计算ans
for (int i = maxAttack; i >= 0; i--) {
if(maxDef > bucket[i]){
// 获取当前攻击值可以获取的 大于其攻击值的最大防御值
bucket[i] = maxDef;
}else{
// 获取当前的最大防御值
maxDef = bucket[i];
}
}
int ans = 0;
for (int i = 0; i < properties.length; i++) {
// 当前下标对应的攻击值在bucket中的下一个位置对应的值,即为大于该攻击值的最大防御值
// 如果符合则说明是弱将
if(bucket[properties[i][0] + 1] > properties[i][1])
ans++;
}
return ans;
}
}