题解 | #牛群的协作#java
牛群的协作
https://www.nowcoder.com/practice/c065b35c5cff41429edbd6484096d708
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param cow_ranges int整型二维数组 * @return int整型 */ public int minParallelAttacks (int[][] cow_ranges) { // write code here // 首先按照牛的右边界从小到大对牛的范围进行排序 Arrays.sort(cow_ranges, (a, b) -> 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
知识点考察:
- 排序算法
- 贪心算法:代码使用贪心策略,每次选择能覆盖最多未覆盖部分的特殊攻击位置,从而减少特殊攻击的次数。
- Lambda 表达式:在排序部分使用了 Lambda 表达式来自定义排序规则。
- 状态更新和迭代:根据不同情况更新 count 和 prevX 变量,实现状态的更新和迭代过程。
代码的解释:
- 传入的二维数组 cow_ranges 表示了每头牛的攻击范围,每行包含两个整数,分别表示牛的攻击范围的左边界和右边界。
- 代码开始使用 Arrays.sort() 方法对牛的攻击范围进行排序,排序规则是根据牛的右边界从小到大排序。
- count 变量用于记录特殊攻击的次数,初始化为 0。
- prevX 变量表示上一个特殊攻击的位置,初始化为负无穷,因为还没有进行特殊攻击。
- 接下来,通过循环遍历每头牛的攻击范围:如果当前牛的攻击范围的左边界大于上一个特殊攻击的位置 prevX,则意味着需要释放新的特殊攻击,因为当前牛的攻击范围与之前的特殊攻击不重叠。在这种情况下,增加 count 计数,表示进行了一次特殊攻击。更新 prevX 为当前牛的攻击范围的右边界,以便下次判断。
- 方法返回 count,即最少需要进行的特殊攻击次数,使所有牛的攻击范围并行。