LC56 挖掘更优雅的实现
先看题目:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
解法1
rust
fn merge(mut intervals: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
if intervals.is_empty() {
return vec![];
}
// 为了方便,先排序
intervals = intervals.sort_by(|a,b|a[0].cmp(&b[0]));
let mut result = vec![intervals[0].clone()];
for i in 1..intervals.len() {
let current = &intervals[i];
let last = result.last_mut().unwrap();
if current[0] <= last[1] {
// 重叠,合并区间
last[1] = last[1].max(current[1]);
//利用max(),减少一次条件的判断
} else {
// 不重叠,添加新区间
result.push(current.clone());
}
}
}
解法2
不用for循环,使用迭代器
思想:排序后,当前cur,看后面的区间是否有重合部分,有的话修改cur[1],没有的话再去push进res
rust
fn merge(mut intervals: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
if intervals.is_empty() {
return vec![];
}
// 为了方便,先排序
intervals.sort_by_key(|interval| interval[0]);
let mut result = vec![];
let mut current = intervals[0].clone();
for interval in intervals.into_iter().skip(1) {
if interval[0] <= current[1] {
current[1] = current[1].max(interval[1]);
} else {
result.push(current);
current = interval;
}
}
// 把最后一个区间加上去
result.push(current);
result
}
解法3
使用reduce
rust
pub fn merge(mut intervals: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
if intervals.is_empty() {
return vec![];
}
// 排序
intervals.sort_by_key(|i| i[0]);
// 取第一个区间
let first = intervals.remove(0);
intervals.into_iter().fold(vec![first], |mut acc, int| {
let last = acc.last_mut().unwrap();
if int[0] <= last[1] {
// 合并区间
last[1] = last[1].max(int[1]);
} else {
// 添加新区间
acc.push(int);
}
acc
})
}