解题思路

  1. 这是一个区间合并问题,需要将重叠的区间合并成一个区间
  2. 解题步骤:
    • 将输入的区间按照起始位置排序
    • 遍历排序后的区间,判断相邻区间是否重叠
    • 如果重叠,则更新当前区间的结束位置
    • 如果不重叠,则将当前区间加入结果集
  3. 最后输出所有合并后的区间

代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int beg, end;
    char temp;
    vector<vector<int>> blocks_temp;
    
    // 读取输入
    while(cin >> beg >> temp >> end) {
        blocks_temp.push_back({beg, end});
    }
    
    // 按区间起始位置排序
    sort(blocks_temp.begin(), blocks_temp.end());
    
    vector<vector<int>> blocks;
    blocks.push_back({blocks_temp[0][0], blocks_temp[0][1]});
    
    // 合并区间
    for(int i = 1; i < blocks_temp.size(); i++) {
        if(blocks_temp[i][0] <= blocks.back()[1]) {
            blocks.back()[1] = max(blocks_temp[i][1], blocks.back()[1]);
        } else {
            blocks.push_back({blocks_temp[i][0], blocks_temp[i][1]});
        }
    }
    
    // 输出结果
    for(int i = 0; i < blocks.size(); i++) {
        cout << blocks[i][0] << "," << blocks[i][1];
        if(i < blocks.size() - 1) cout << " ";
    }
    
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] intervals = line.split(" ");
        
        List<int[]> blocksList = new ArrayList<>();
        for(String interval : intervals) {
            String[] nums = interval.split(",");
            blocksList.add(new int[]{
                Integer.parseInt(nums[0]),
                Integer.parseInt(nums[1])
            });
        }
        
        // 按区间起始位置排序
        Collections.sort(blocksList, (a, b) -> a[0] - b[0]);
        
        List<int[]> result = new ArrayList<>();
        result.add(blocksList.get(0));
        
        // 合并区间
        for(int i = 1; i < blocksList.size(); i++) {
            if(blocksList.get(i)[0] <= result.get(result.size()-1)[1]) {
                result.get(result.size()-1)[1] = Math.max(
                    blocksList.get(i)[1],
                    result.get(result.size()-1)[1]
                );
            } else {
                result.add(blocksList.get(i));
            }
        }
        
        // 输出结果
        for(int i = 0; i < result.size(); i++) {
            System.out.print(result.get(i)[0] + "," + result.get(i)[1]);
            if(i < result.size() - 1) System.out.print(" ");
        }
    }
}
def merge_intervals(intervals):
    # 按区间起始位置排序
    intervals.sort(key=lambda x: x[0])
    
    result = [intervals[0]]
    
    # 合并区间
    for interval in intervals[1:]:
        if interval[0] <= result[-1][1]:
            result[-1][1] = max(interval[1], result[-1][1])
        else:
            result.append(interval)
    
    return result

# 读取输入
line = input().strip()
intervals = []
for interval in line.split():
    start, end = map(int, interval.split(','))
    intervals.append([start, end])

# 合并区间并输出
result = merge_intervals(intervals)
print(' '.join(f'{interval[0]},{interval[1]}' for interval in result))

算法及复杂度

  • 算法:排序 + 一次遍历
  • 时间复杂度: - 主要来自排序
  • 空间复杂度: - 需要存储合并后的区间