题解 | #牛群的协作#

牛群的协作

https://www.nowcoder.com/practice/c065b35c5cff41429edbd6484096d708

知识点:双指针,贪心

这道题目要求我们找到各个数组之间的重叠部分最少是几个,我们首先要做的就是对数组进行排序,可以按照左端点升序排列,因为我们需要涵盖所有的数组,故我们可以使用贪心的思想,总是去考虑我们的右端点最多能涵盖几个数组。

我们可以使用双指针,left指向我们目前没有统计的数组,再看该数组的右端点,是否可以涵盖下一个数组(因为我们之前按左端点排序,故下一个数组一定是最有可能涵盖的),若可以涵盖,则需要更新我们可以到达的右端点,因为我们要涵盖当前的所有数组,故右端点需要取各个数组右端点的最小值。若下一个数组无法被涵盖,则left指针指向下一个未统计的数组,直至所有数组统计完毕。

Java题解如下

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param cow_ranges int整型二维数组 
     * @return int整型
     */
    public int minParallelAttacks (int[][] cow_ranges) {
        // write code here
        int n = cow_ranges.length;
        Arrays.sort(cow_ranges, (o1, o2) -> (o1[0] - o2[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 = Math.min(end, cow_ranges[right][1]);
                right++;
            }
            left = right;
            count++;
        }
        return count;
    }
}

全部评论

相关推荐

数学转码崽:一直给我推,投了又不理,理了又秒挂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务