考察的知识点:贪心;
解答方法分析:
- 根据奶牛的起始位置对
cow_ranges
中的元素进行排序,以确保处理的起始位置是从小到大的顺序。 - 初始化计数器
count
为0,表示初始并行攻击次数。 - 初始化两个指针
left
和right
,初始值都为0。 - 进入循环,当
left
小于列表的长度时进行迭代。 - 在每次迭代中,将
cow_ranges[left][1]
赋值给end
,表示当前奶牛的攻击范围的右边界。 - 在内层循环中,逐个检查从
right
到列表的末尾的奶牛的起始位置。如果奶牛的起始位置小于等于end
,则更新end
为min(end, cow_ranges[right][1])
,表示可以并行攻击的奶牛的最右边界。 - 在内层循环结束后,将
right
的值赋给left
,表示已经处理完当前并行攻击范围内的奶牛。 - 将
count
加1,表示已经进行了一次并行攻击。 - 重复步骤4到步骤8,直到
left
超过列表的长度。 - 返回最终结果,即
count
的值,表示最小的并行攻击次数。
所用编程语言:C++;
完整编程代码:↓
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param cow_ranges int整型vector<vector<>> * @return int整型 */ int minParallelAttacks(vector<vector<int> >& cow_ranges) { int n = cow_ranges.size(); sort(cow_ranges.begin(), cow_ranges.end(), [](const vector<int>& a, const vector<int>& b) { return a[0] < b[0]; }); int count = 0; int left = 0, right = 0; while (left < n) { int end = cow_ranges[left][1]; while (right < n && cow_ranges[right][0] <= end) { end = min(end, cow_ranges[right][1]); right++; } left = right; count++; } return count; } };