嗨,亲爱的读者朋友们!在今天的这篇博客中,我们将深入探讨一个在编程和算法中常见但又很有趣的话题——区间合并。这个话题可能让一些初学者感到头疼,但我会尽力通过生动的例子和简单的解释来让你对它有一个清晰的认识。
首先,让我们来想象一下一群数字,它们就像是一个个散落在时间轴上的点。但有时候,我们想要将它们以一种更有条理的方式组织起来。这就是区间合并的用武之地!
在程序设计中,区间合并是指将一系列有交集的区间融合成更大的区间,从而让数据更加紧凑、有序。举个例子,假设我们有一组区间 [1, 5]、[3, 8]、[7, 10],那么合并后的结果就是 [1, 10]。
那么,你可能会问,为什么我们需要进行区间合并呢?首先,它有助于简化数据结构,减少不必要的冗余。其次,当我们处理一些范围相关的问题时,合并后的区间能够更好地反映问题的本质,使得解决方案更加清晰。
举个例子:
假设我们有一组时间段,表示一天中的各种活动开始和结束的时间。比如,有人在 [9:00, 12:00] 喝咖啡,又有人在 [10:30, 11:30] 开会。如果我们想知道这一天总共有哪些时间段是被占用的,区间合并就可以帮助我们找到答案。
区间合并的算法思路并不复杂。我们可以按照区间的起始时间进行排序,然后依次遍历,合并有交集的区间。这样,我们就能得到一个合并后的结果
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> mergeIntervals(vector<vector<int>>& intervals) {
if (intervals.empty()) {
return {};
}
// 按照起始时间升序排序
sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
});
vector<vector<int>> merged;
merged.push_back(intervals[0]);
for (int i = 1; i < intervals.size(); ++i) {
if (merged.back()[1] >= intervals[i][0]) {
// 有重叠,合并区间
merged.back()[1] = max(merged.back()[1], intervals[i][1]);
} else {
// 无重叠,添加新区间
merged.push_back(intervals[i]);
}
}
return merged;
}
int main() {
// 示例输入:[[1, 3], [2, 6], [8, 10], [15, 18]]
vector<vector<int>> intervals = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
// 调用区间合并函数
vector<vector<int>> result = mergeIntervals(intervals);
// 输出合并后的区间
cout << "Merged Intervals: ";
for (const auto& interval : result) {
cout << "[" << interval[0] << ", " << interval[1] << "] ";
}
return 0;
}
def merge_intervals(intervals):
if not intervals:
return []
intervals.sort(key=lambda x: x[0])
merged = [intervals[0]]
for i in range(1, len(intervals)):
if merged[-1][1] >= intervals[i][0]:
merged[-1] = [merged[-1][0], max(merged[-1][1], intervals[i][1])]
else:
merged.append(intervals[i])
return merged
区间合并是一个在算法和编程中经常遇到的问题,掌握了这个技能,你就能更加优雅地处理一些与范围有关的数据。通过本文的介绍,希望你对区间合并有了更清晰的认识。如果你有任何疑问或想分享你的见解,请随时在评论中留言。让我们一起让数字之间的故事更加有序吧!