区间合并

84 阅读1分钟

Snipaste_2023-02-26_16-03-07.png

模板

  • C++
// 将所有存在交集的区间合并
void merge(vector<PII> &segs)
{
    vector<PII> res;

    sort(segs.begin(), segs.end());

    int st = -2e9, ed = -2e9;
    for (auto seg : segs)
        if (ed < seg.first)
        {
            if (st != -2e9) res.push_back({st, ed});
            st = seg.first, ed = seg.second;
        }
        else ed = max(ed, seg.second);

    if (st != -2e9) res.push_back({st, ed});

    segs = res;
}
  • Java
public static class PII implements Comparable<PII> {
        int first;
        int second;

        public PII(int first, int second) {
            this.first = first;
            this.second = second;
        }

        @Override
        public int compareTo(PII o) {
            return Integer.compare(first, o.first);
        }
    }

public static void merge() {
        List<PII> res = new ArrayList<>();

        Collections.sort(segs);

        int st = (int) -2e9;//这里为实际问题的边界外
        int ed = (int) -2e9;

        for (PII seg : segs) {
            if (ed < seg.first) {
                if (ed != (int) -2e9) {
                    res.add(new PII(st, ed));
                }
                st = seg.first;
                ed = seg.second;
            } else {
                ed = ed > seg.second ? ed : seg.second;
            }
        }
        if (st != (int) -2e9) {
            res.add(new PII(st, ed));
        }
        segs = res;
    }

练习

01 区间合并

  • 题目

Snipaste_2023-02-26_17-17-15.png

  • 题解
import java.io.*;
import java.util.*;

public class Main {
    public static int n;
    public static List<PII> segs = new ArrayList<>();

    public static class PII implements Comparable<PII> {
        int first;
        int second;

        public PII(int first, int second) {
            this.first = first;
            this.second = second;
        }

        @Override
        public int compareTo(PII o) {
            return Integer.compare(first, o.first);
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
        n = Integer.parseInt(br.readLine());
        for (int i = 0; i < n; i++) {
            String[] str1 = br.readLine().split(" ");
            segs.add(new PII(Integer.parseInt(str1[0]), Integer.parseInt(str1[1])));
        }
        merge();
        pw.println(segs.size());

        pw.close();
        br.close();
    }

    public static void merge() {
        List<PII> res = new ArrayList<>();

        Collections.sort(segs);

        int st = (int) -2e9;
        int ed = (int) -2e9;

        for (PII seg : segs) {
            if (ed < seg.first) {
                if (ed != (int) -2e9) {
                    res.add(new PII(st, ed));
                }
                st = seg.first;
                ed = seg.second;
            } else {
                ed = ed > seg.second ? ed : seg.second;
            }
        }
        if (st != (int) -2e9) {
            res.add(new PII(st, ed));
        }
        segs = res;
    }
}