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 编写的。

这道题考察的主要知识点包括:

  1. 排序算法的应用: 原始牛的范围根据牛的右边界进行了排序,以便在处理过程中可以有效地选择最优的攻击位置。
  2. 贪心算法: 通过贪心地选择最优的攻击位置,能够在每次攻击时击败尽可能多的牛,从而最终得到最小的攻击次数。
  3. 数组操作: 对二维数组的操作,如获取左右边界,以及在数组中的迭代。

代码的文字解释如下:

  • 对牛的范围数组 cow_ranges 按照牛的右边界进行升序排序,这样可以确保在攻击时能够尽可能击败多的牛,从而减少攻击次数。
  • 维护两个变量:count 表示特殊攻击次数,prevX 表示上一个特殊攻击的位置。初始化 prevX 为负无穷小。
  • 遍历排序后的牛的范围数组。对于每头牛,如果其范围的左边界大于 prevX,说明需要释放新的特殊攻击,以便击败当前这头牛以及其他可能在这个攻击位置被击败的牛。
  • 将 count 增加 1,表示进行了一次特殊攻击,然后将 prevX 更新为当前牛的右边界,以便在下一次攻击时能够选择一个合适的位置。
  • 返回 count,即为击败所有牛所需的最小特殊攻击次数。