题解 | #牛群的协作#

88 阅读2分钟

描述

在一个平行世界里,有一群牛位于一维平面上。它们的位置可以用一维整数坐标系表示。牛群的位置记录在整数数组 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;
    }
}

解题思路

遍历牛的范围数组。如果当前牛的范围左边界大于当前特殊攻击的位置,说明需要进行一次新的特殊攻击。此时,特殊攻击次数加一,并更新特殊攻击的位置为当前牛的范围右边界。

如果当前牛的范围右边界小于等于当前特殊攻击的位置,说明当前牛的范围已经被前面的特殊攻击覆盖,可以继续使用当前的特殊攻击来覆盖其他牛的范围。此时,更新特殊攻击的位置为当前牛的范围右边界。

最后,得到击败所有牛所需的最小特殊攻击次数,并返回。