华为OD机试-会议室占用时间段(Java 2024 C卷 100分)

题目描述

现有若干个会议,所有会议共享一个会议室,用数组表示各个会议的开始时间和结束时间,格式为:[[会议1开始时间, 会议1结束时间], [会议2开始时间, 会议2结束时间], ...]。请计算会议室占用时间段。

输入描述

输入为一个二维数组,表示各个会议的开始时间和结束时间。会议个数范围为 [1,100],会议室时间段为 [1,24]。

输出描述

输出格式与输入一致,输出合并后的会议室占用时间段。

示例

输入:

[[1,4],[4,5]]

输出:

[[1,5]]

解题思路

  1. 排序: 首先按照会议的开始时间进行排序。
  2. 合并: 遍历排序后的会议列表,如果当前会议的开始时间小于或等于前一个会议的结束时间,则合并这两个会议。
  3. 输出: 输出合并后的会议室占用时间段。

代码实现

Java
import java.util.*;

public class Solution {
    public int[][] merge(int[][] intervals) {
        if (intervals.length <= 1) {
            return intervals;
        }

        // Sort by start time
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));

        List<int[]> merged = new ArrayList<>();
        int[] currentInterval = intervals[0];
        merged.add(currentInterval);

        for (int[] interval : intervals) {
            int currentEnd = currentInterval[1];
            int nextStart = interval[0];
            int nextEnd = interval[1];

            if (currentEnd >= nextStart) {
                currentInterval[1] = Math.max(currentEnd, nextEnd);
            } else {
                currentInterval = interval;
                merged.add(currentInterval);
            }
        }

        return merged.toArray(new int[merged.size()][]);
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[][] intervals = {{1, 4}, {4, 5}};
        int[][] result = solution.merge(intervals);
        for (int[] interval : result) {
            System.out.print(Arrays.toString(interval) + " ");
        }
    }
}
Python
def merge(intervals):
    if not intervals:
        return []

    # Sort by start time
    intervals.sort(key=lambda x: x[0])

    merged = []
    current_interval = intervals[0]
    merged.append(current_interval)

    for interval in intervals:
        current_end = current_interval[1]
        next_start = interval[0]
        next_end = interval[1]

        if current_end >= next_start:
            current_interval[1] = max(current_end, next_end)
        else:
            current_interval = interval
            merged.append(current_interval)

    return merged

intervals = [[1, 4], [4, 5]]
result = merge(intervals)
print(result)
C++
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<vector<int>> merge(vector<vector<int>>& intervals) {
    if (intervals.size() <= 1) {
        return intervals;
    }

    // Sort by start time
    sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b) {
        return a[0] < b[0];
    });

    vector<vector<int>> merged;
    vector<int> currentInterval = intervals[0];
    merged.push_back(currentInterval);

    for (const auto& interval : intervals) {
        int currentEnd = currentInterval[1];
        int nextStart = interval[0];
        int nextEnd = interval[1];

        if (currentEnd >= nextStart) {
            currentInterval[1] = max(currentEnd, nextEnd);
        } else {
            currentInterval = interval;
            merged.push_back(currentInterval);
        }
    }

    return merged;
}

int main() {
    vector<vector<int>> intervals = {{1, 4}, {4, 5}};
    vector<vector<int>> result = merge(intervals);
    for (const auto& interval : result) {
        cout << "[" << interval[0] << ", " << interval[1] << "] ";
    }
    return 0;
}
JavaScript
function merge(intervals) {
    if (intervals.length <= 1) {
        return intervals;
    }

    // Sort by start time
    intervals.sort((a, b) => a[0] - b[0]);

    const merged = [];
    let currentInterval = intervals[0];
    merged.push(currentInterval);

    for (const interval of intervals) {
        const currentEnd = currentInterval[1];
        const nextStart = interval[0];
        const nextEnd = interval[1];

        if (currentEnd >= nextStart) {
            currentInterval[1] = Math.max(currentEnd, nextEnd);
        } else {
            currentInterval = interval;
            merged.push(currentInterval);
        }
    }

    return merged;
}

const intervals = [[1, 4], [4, 5]];
const result = merge(intervals);
console.log(result);

复杂度分析

  • 时间复杂度: O(n log n),其中 n 是会议的数量。排序的时间复杂度为 O(n log n),合并的时间复杂度为 O(n)。
  • 空间复杂度: O(n),用于存储合并后的会议时间段。

总结

通过排序和合并重叠的会议时间段,我们可以有效地计算会议室的占用时间段。不同语言的实现方式略有不同,但核心思路一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝白咖啡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值