当前位置: 面试刷题>> 合并区间(经典算法150题)
### 题目描述
给定一个区间的集合,合并所有重叠的区间,并以 `[start, end]` 的形式返回合并后的结果。确保合并后的区间列表按非递减顺序排列,且合并后的每个区间的开始值小于或等于前一个区间的结束值。
**示例 1**:
```
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
```
**示例 2**:
```
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间,因为它们是连续的。
```
### PHP 示例代码
```php
```
### Python 示例代码
```python
def merge(intervals):
if not intervals:
return []
# 根据区间的起始位置进行排序
intervals.sort(key=lambda x: x[0])
merged = [intervals[0]]
# 遍历排序后的区间,进行合并
for interval in intervals[1:]:
last_merged = merged[-1]
# 如果当前区间的起始位置小于等于上一个合并区间的结束位置,则进行合并
if interval[0] <= last_merged[1]:
last_merged[1] = max(last_merged[1], interval[1])
else:
# 如果不重叠,直接将当前区间加入合并列表
merged.append(interval)
return merged
# 示例用法
intervals = [[1,3],[2,6],[8,10],[15,18]]
print(merge(intervals))
```
### JavaScript 示例代码
```javascript
function merge(intervals) {
if (!intervals.length) {
return [];
}
// 根据区间的起始位置进行排序
intervals.sort((a, b) => a[0] - b[0]);
let merged = [intervals[0]];
// 遍历排序后的区间,进行合并
for (let i = 1; i < intervals.length; i++) {
let current = intervals[i];
let lastMerged = merged[merged.length - 1];
// 如果当前区间的起始位置小于等于上一个合并区间的结束位置,则进行合并
if (current[0] <= lastMerged[1]) {
lastMerged[1] = Math.max(lastMerged[1], current[1]); // 更新结束位置
} else {
// 如果不重叠,直接将当前区间加入合并列表
merged.push(current);
}
}
return merged;
}
// 示例用法
const intervals = [[1,3],[2,6],[8,10],[15,18]];
console.log(merge(intervals));
```
以上代码均展示了如何合并给定区间列表的算法实现,并提供了示例用法。这些代码可以很好地满足面试要求,并可以在码小课网站上作为学习资源分享。