import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param cow_ranges int整型二维数组 * @return int整型 */ public int minParallelAttacks (int[][] cow_ranges) { // 首先按照牛的右边界从小到大对牛的范围进行排序 Arrays.sort(cow_ranges, new Comparator<int[]>() { @Override public int compare(int[] a, int[] b) { return Integer.compare(a[1], b[1]); } }); int count = 0; // 特殊攻击次数 int prevX = Integer.MIN_VALUE; // 上一个特殊攻击的位置,初始化为负无穷 for (int[] cow : cow_ranges) { // 如果牛的范围左边界大于上一个特殊攻击的位置,说明需要释放新的特殊攻击 if (cow[0] > prevX) { count++; // 特殊攻击次数加一 prevX = cow[1]; // 更新上一个特殊攻击的位置为当前牛的右边界 } } return count; } }
Java 编写的。
这道题考察的主要知识点包括:
- 排序算法的应用: 原始牛的范围根据牛的右边界进行了排序,以便在处理过程中可以有效地选择最优的攻击位置。
- 贪心算法: 通过贪心地选择最优的攻击位置,能够在每次攻击时击败尽可能多的牛,从而最终得到最小的攻击次数。
- 数组操作: 对二维数组的操作,如获取左右边界,以及在数组中的迭代。
代码的文字解释如下:
- 对牛的范围数组 cow_ranges 按照牛的右边界进行升序排序,这样可以确保在攻击时能够尽可能击败多的牛,从而减少攻击次数。
- 维护两个变量:count 表示特殊攻击次数,prevX 表示上一个特殊攻击的位置。初始化 prevX 为负无穷小。
- 遍历排序后的牛的范围数组。对于每头牛,如果其范围的左边界大于 prevX,说明需要释放新的特殊攻击,以便击败当前这头牛以及其他可能在这个攻击位置被击败的牛。
- 将 count 增加 1,表示进行了一次特殊攻击,然后将 prevX 更新为当前牛的右边界,以便在下一次攻击时能够选择一个合适的位置。
- 返回 count,即为击败所有牛所需的最小特殊攻击次数。