Leetcode 3169. Count Days Without Meetings 题解

# Intuition

To get meeting count, we just need to get dis-joint continous segments where meeting days are contained.

First sort this array, with order:

1.a[0] == b[0], compare a[1] > b[1]

2.a[0] < b[0], return -1;

3.a[0] > b[1], return 1;

Then travel in the sorted 2D array:

1. meeting[i+1][0] > meeting[i][1]: means the new segment started, add a segment to result.

2. meeting[i+1][0] <= meeting[i][1]:

2.1 if meeting[i+1][1] > meeting[i][1]: merge the prev segment's end to meeting[i+1][1], in other words, enlarge the prev segment.

2.2 if meeting[i+1][1] > meeting[i][1]: means the prev segment contains the current segment, do nothing.

3. meeting[i+1][0] == meeting[i][1]: means the prev segment is adjacent to current segment, just check whether meeting[i+1][1] > meeting[i][1], if so, merge the prev segment's end to meeting[i+1][1].

Total Time complexity is sorting cost: O(n*logn)

<!-- Describe your first thoughts on how to solve this problem. -->

# Approach

<!-- Describe your approach to solving the problem. -->

# Complexity

- Time complexity:

- O(nlogn)

<!-- Add your time complexity here, e.g. $$O(n)$$ -->

- Space complexity:

- O(n): The worst case is every segment length is 1 and all elements are in segments.

<!-- Add your space complexity here, e.g. $$O(n)$$ -->

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Solution {
    public int countDays(int days, int[][] meetings) {
        Arrays.sort(meetings, (a, b) -> a[0] != b[0] ? (a[0] - b[0]) : (a[1] != b[1] ? (a[1] - b[1]) : 0));
        List<List<Integer>> segment = new ArrayList<>();

        for (int[] meeting : meetings) {
            if (segment.isEmpty()) {
                List<Integer> list = new ArrayList<>();
                list.add(meeting[0]);
                list.add(meeting[1]);
                segment.add(list);
            } else {
                List<Integer> list = segment.get(segment.size() - 1);
                if (meeting[0] == list.get(1)) {
                    list.set(1, meeting[1]);
                } else if (meeting[0] < list.get(1)) {
                    if (meeting[1] > list.get(1)) {
                        list.set(1, meeting[1]);
                    }
                } else {
                    List<Integer> list2 = new ArrayList<>();
                    list2.add(meeting[0]);
                    list2.add(meeting[1]);
                    segment.add(list2);
                }
            }
        }
        int count = 0;
        for (List<Integer> segmentItem : segment) {
            count += segmentItem.get(1) - segmentItem.get(0) + 1;
        }

        return days - count;
    }
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值