题解 | #合并区间#
合并区间
https://www.nowcoder.com/practice/0596b6232ce74b18b60ba0367d7f2492
解题思路
- 这是一个区间合并问题,需要将重叠的区间合并成一个区间
- 解题步骤:
- 将输入的区间按照起始位置排序
- 遍历排序后的区间,判断相邻区间是否重叠
- 如果重叠,则更新当前区间的结束位置
- 如果不重叠,则将当前区间加入结果集
- 最后输出所有合并后的区间
代码
#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))
算法及复杂度
- 算法:排序 + 一次遍历
- 时间复杂度:
- 主要来自排序
- 空间复杂度:
- 需要存储合并后的区间