小学生都能看懂的题解 | #合并区间#
合并区间
https://www.nowcoder.com/practice/69f4e5b7ad284a478777cb2a17fb5e6a
方案解释:
-
什么是区间? 区间就像一个范围,比如
[10, 30]
表示从 10 到 30 之间的所有数字。 -
我们的目标:我们要把给定的一些可能有重叠的区间合并成更大的区间。例如,如果我们有两个区间
[10, 30]
和[20, 60]
,因为它们有重叠部分(从 20 到 30),所以我们可以把它们合并成[10, 60]
。 -
步骤:
- 排序:首先,我们把所有的区间按起始数字从小到大排序。这样,重叠的区间就会放在一起。
- 合并:然后,从第一个区间开始,检查每个区间:
- 如果当前区间的结束数字大于或等于下一个区间的起始数字,就说明这两个区间有重叠,我们就合并它们。
- 如果没有重叠,我们就把当前区间放到结果中,并开始检查下一个区间。
代码解释:
以下是这个方法的代码结构,简化了部分细节来便于理解:
import java.util.ArrayList;
import java.util.Collections;
class Interval {
int start;
int end;
Interval(int start, int end) {
this.start = start;
this.end = end;
}
}
public class IntervalMerger {
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
// 1. 如果没有区间,直接返回一个空的列表
if (intervals.size() == 0) {
return new ArrayList<Interval>();
}
// 2. 按照区间的起始值排序
Collections.sort(intervals, (a, b) -> a.start - b.start);
// 3. 创建一个新的列表来存放合并后的区间
ArrayList<Interval> merged = new ArrayList<>();
Interval currentInterval = intervals.get(0); // 从第一个区间开始
// 4. 遍历所有区间
for (int i = 1; i < intervals.size(); i++) {
// 5. 如果当前区间和下一个区间重叠
if (currentInterval.end >= intervals.get(i).start) {
// 合并这两个区间
currentInterval.end = Math.max(currentInterval.end, intervals.get(i).end);
} else {
// 如果没有重叠,把当前区间加入结果
merged.add(currentInterval);
currentInterval = intervals.get(i); // 更新当前区间
}
}
// 6. 添加最后一个合并的区间
merged.add(currentInterval);
return merged; // 返回合并后的区间
}
}
代码分解:
-
导入和定义:
- 我们引入了一些工具,然后定义了一个
Interval
类,里面有两个数字start
和end
,表示区间的起始和结束。
- 我们引入了一些工具,然后定义了一个
-
方法开始:
merge
方法接收一个区间的列表intervals
。
-
检查空列表:
- 如果没有区间,就返回一个空的列表。
-
排序:
- 我们把所有区间按起始值从小到大排序,这样重叠的区间会在一起。
-
合并逻辑:
- 创建一个新的列表
merged
来存放合并后的区间。 - 从第一个区间开始,逐个检查后面的区间:
- 如果当前区间和下一个区间重叠,我们就合并它们(更新结束值)。
- 如果没有重叠,就把当前区间加入结果列表,继续检查下一个区间。
- 创建一个新的列表
-
结束添加:
- 在所有区间检查完后,别忘了把最后一个合并的区间也加入结果。
-
返回结果:
- 最后,返回合并后的区间列表。
希望这篇文章对你有帮助👍。
#牛客创作赏金赛##题解#小学生都能看懂的算法 文章被收录于专栏
主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。