【问题标题】:Merge intervals in one for-loop在一个 for 循环中合并区间
【发布时间】: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 &lt; 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


【解决方案1】:

总结对现有代码的可能更改/增强:

  • 在类 Pair 中提供一个复制构造函数并覆盖 toString() 为方便起见
  • 加强merge方法中输入数据的验证
  • 对输入数据进行排序以保证区间的顺序
  • merge方法中使用Pair复制构造函数
class Pair{
    public int first;
    public int second;
    
    public Pair(int x, int y){
        this.first = x;
        this.second = y; 
    }
    
    public Pair(Pair p) {
        this(p.first, p.second);
    }
    
    @Override
    public String toString() {
        return "(" + first + ", " + second + ")";
    }
}

class MergeIntervals{
    public static List<Pair> merge(List<Pair> v) {
        if (null == v) {
            return null;
        }
        // early return an empty list or containing a single pair
        if (v.size() < 1) {
            return v;
        }
        List<Pair> result = new ArrayList<>();
        
        Collections.sort(v, (a, b) -> Integer.compare(a.first, b.first));
        
        Pair current = new Pair(v.get(0));
        
        for (int i = 1; i < v.size(); i++) {
            Pair p = v.get(i);
            if (p.first <= current.second) {
                current.second = Math.max(p.second, current.second);
            } else {
                result.add(current);
                current = new Pair(p);
            }
        }
        result.add(current);

        return result;
    }
}

测试:

List<Pair> data = Arrays.asList(
    new Pair(3, 7),
    new Pair(1, 5),
    new Pair(6, 8),
    new Pair(4, 6),
    new Pair(10, 12),
    new Pair(12, 15)
);

System.out.println(MergeIntervals.merge(data));

输出:

[(1, 8), (10, 15)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多