【发布时间】:2021-02-05 23:02:01
【问题描述】:
这可能是一个奇怪的问题,但我正在尝试合并间隔时间,只是担心在 for 循环之外有一行 - 我真的想将该行(哈哈)合并到 for 循环中让一切立即发生。
问题:假设给定区间 (1, 5), (3, 7), (4, 6), (6, 8), (10, 12), (12, 15)程序应该返回 (1,8),(10,15),因为它们合并了所有重叠的区间。
我的方法是我有一个包含第一对值的当前值,然后我运行一个从 1 到结束的 for 循环,并检查我所在的对是否与我的当前值合并。如果它确实合并,我会更新我当前对中的值,如果它不合并,那么我将 current 添加到我的结果列表中,然后将其值更新到我当前所在的任何节点。
随意更改代码,但有必要使其全部在一个 for 循环中工作。 如果您发现代码有任何其他错误,请告诉我。谢谢!
class Pair{
public int first;
public int second;
public Pair(int x, int y){
this.first = x;
this.second = y;
}
}
class MergeIntervals{
static ArrayList<Pair> mergeIntervals(ArrayList<Pair> v) {
ArrayList<Pair> result = new ArrayList<Pair>();
//check for size & null
if(v == null || v.size() == 0) {
return null;
}
if(v.size() == 0) {
result.add(v.get(0));
return result;
}
Pair current = new Pair(v.get(0).first, v.get(0).second);
for(int i = 1; i < v.size(); i++) {
//want to merge
if(v.get(i).first < current.second) {
if(v.get(i).second > current.second) {
current.second = v.get(i).second;
}
}
else {
result.add(new Pair(current.first, current.second));
current.first = v.get(i).first;
current.second = v.get(i).second;
}
}
//loop broke before was able to merge
result.add(new Pair(current.first, current.second));
return result;
}
}
【问题讨论】:
-
在想要合并评论之后,它可能应该是
-
另外,如果 size == 1 则添加元素 0 而如果 size == 0 则不添加元素,可以在前面的 if 中替换为 v.isEmpty()。
-
最后你可以在最后添加 current 因为它不再被修改了。如果你想要它在循环中,我不推荐,只需在它之前添加 if(i == v.size() - 1) 并将它放在循环的末尾,但是你也可以在之后中断在 if 中添加最后一个元素并从 for 中删除 i
-
当
(v.get(i).first < current.second)你应该扩展两端:current.first = Math.min(current.first, v.get(i).first); current.second = Math.max(current.second, v.get(i).second);
标签: java algorithm arraylist merge array-merge