描述
在一个平行世界里,有一群牛位于一维平面上。它们的位置可以用一维整数坐标系表示。牛群的位置记录在整数数组 cow_ranges,其中 cow_ranges[i] = [left, right] 表示第 i 头牛所在的范围从 left 到 right。所有的牛都位于 y=0 处。
为了保存平行世界的和平,你需要发起一场特殊的攻击来击败这些牛。所有特殊攻击都在 x 轴上进行,且角度始终垂直。特殊攻击可以在任意 x 位置释放,牛的范围若是包含x位置就会被击败。
给定一个数组 cow_ranges,返回击败所有牛所需的最小特殊攻击次数。
示例1
输入:[[11,18],[3,10],[2,7],[8,15]]
返回值:2
说明:可以用2次特殊攻击击败:
在 x = 7 处释放特殊攻击,击败牛 [3,10] 和 [2,7]。在 x = 11 处释放特殊攻击,击败牛 [11,18] 和 [8,15]。
或者有其他击败方式,取最少次数即可。
示例2
输入:[[2,3],[5,6],[8,9],[11,12]]
返回值:4
说明:每头牛都需要进行一次特殊攻击,总共需要4次。
备注:
1 <= cow_ranges.length <= 2 * 10^5cow_ranges[i].length == 2-2^31 <= left < right <= 2^31 - 1
知识点
贪心算法
Java题解
import java.util.*;
public class Solution {
public int minParallelAttacks (int[][] cow_ranges) {
Arrays.sort(cow_ranges, Comparator.comparingInt(a -> a[0]));
int count = 0;
// 当前特殊攻击的位置
int pos = Integer.MIN_VALUE;
// 遍历牛的范围数组
for (int[] range : cow_ranges) {
// 如果当前牛的范围左边界大于当前特殊攻击的位置,说明需要进行一次新的特殊攻击
if (range[0] > pos) {
count++;
pos = range[1]; // 更新特殊攻击的位置为当前牛的范围右边界
} else {
// 如果当前牛的范围右边界小于等于当前特殊攻击的位置,说明当前牛的范围已经被前面的特殊攻击覆盖
// 可以继续使用当前的特殊攻击来覆盖其他牛的范围
pos = Math.min(pos, range[1]);
}
}
return count;
}
}
解题思路
遍历牛的范围数组。如果当前牛的范围左边界大于当前特殊攻击的位置,说明需要进行一次新的特殊攻击。此时,特殊攻击次数加一,并更新特殊攻击的位置为当前牛的范围右边界。
如果当前牛的范围右边界小于等于当前特殊攻击的位置,说明当前牛的范围已经被前面的特殊攻击覆盖,可以继续使用当前的特殊攻击来覆盖其他牛的范围。此时,更新特殊攻击的位置为当前牛的范围右边界。
最后,得到击败所有牛所需的最小特殊攻击次数,并返回。