100311. 无需开会的工作日

中等
 

给你一个正整数 days,表示员工可工作的总天数(从第 1 天开始)。另给你一个二维数组 meetings,长度为 n,其中 meetings[i] = [start_i, end_i] 表示第 i 次会议的开始和结束天数(包含首尾)。

返回员工可工作且没有安排会议的天数。

注意:会议时间可能会有重叠。

 

示例 1:

输入:days = 10, meetings = [[5,7],[1,3],[9,10]]

输出:2

解释:

第 4 天和第 8 天没有安排会议。

示例 2:

输入:days = 5, meetings = [[2,4],[1,3]]

输出:1

解释:

第 5 天没有安排会议。

示例 3:

输入:days = 6, meetings = [[1,6]]

输出:0

解释:

所有工作日都安排了会议。

 

提示:

  • 1 <= days <= 109
  • 1 <= meetings.length <= 105
  • meetings[i].length == 2
  • 1 <= meetings[i][0] <= meetings[i][1] <= days

 

1. 暴力遍历法

/*    public int countDays(int days, int[][] meetings) {
        int[] buzy = new int[days+1];
        int count = 0;
        for(int[] meeting : meetings) {
            for(int i = meeting[0]; i <= meeting[1]; i++) {
                buzy[i] = buzy[i] + 1;
            }
        }
        for(int i = 1; i <= days; i++) {
            if(buzy[i]==0){
                count++;
            }
        }
        return count;
    }*/

 

 

2. 合并区间问题

public static int countDays(int days, int[][] meetings) {
        int count = 0;
        Arrays.sort(meetings, new Comparator<int[]>() {
            public int compare(int[] a, int[] b) {
                return a[0] - b[0];
            }
        });
        List<int[]> merged = new ArrayList<>();
        int[] currentInterval = meetings[0];
        merged.add(currentInterval);

        for (int[] nextInterval : meetings) {
            // 如果当前区间的结束时间大于下一个区间的开始时间,则合并它们
            if (currentInterval[1] >= nextInterval[0]) {
                currentInterval[1] = Math.max(currentInterval[1], nextInterval[1]);
            } else {
                // 否则,当前区间已经结束,开始一个新的区间
                currentInterval = nextInterval;
                merged.add(currentInterval);
            }
        }
        int[][] res = merged.toArray(new int[merged.size()][]);
        count=Math.abs(res[0][0]-1)+Math.abs(days-res[res.length-1][1]);
        for(int i = 1; i < res.length; i++) {
           count+=Math.abs(res[i][0]-res[i-1][1]-1);
        }
        return count;
    }

 

 

posted @ 2024-06-02 11:58  Heinrich♣  阅读(31)  评论(0编辑  收藏  举报