56. Merge Intervals

区间合并,先将input根据start的大小进行排序,比较下一个start和前一个end的值的大小,如果下一个start比较大,那么就需要重新记下end的最大值。反之,加入新的Interval。还需要注意一下Scanner的写法。

测试用例:

// 1
4
1,3
2,6
8,10
15,18

// 2
3
1,10;32,45
78,94;5,16
80,100;200,220;16,32
import java.util.*;

class Interval {
    int start;
    int end;

    public Interval(int start, int end) {
        this.start = start;
        this.end = end;
    }
}

class MergeInterval {
    public static void main(String[] args) {
        List<Interval> res = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        int num = Integer.parseInt(sc.nextLine());
        for (int i = 0; i < num; i++) {
            String[] line = sc.nextLine().split(";");

            for (int j = 0; j < line.length; j++) {
                String[] unit = line[j].split(",");
                System.out.println(Arrays.toString(line));
                System.out.println(Arrays.toString(unit));
                res.add(new Interval(Integer.parseInt(unit[0]), Integer.parseInt(unit[1])));
            }
        }

        List<Interval> result = merge(res);
        for (Interval i : result) {
            System.out.println(i.start + " " + i.end);
        }
    }

    public static List<Interval> merge(List<Interval> intervals) {
        if (intervals.size() <= 1) {
            return intervals;
        }

        List<Interval> res = new LinkedList<>();
        Comparator<Interval> c = new Comparator<>() {
            @Override
            public int compare(Interval i1, Interval i2) {
                return Integer.compare(i1.start, i2.start);
            }
        };
        // Comparator<Interval> c = (i1, i2) -> Integer.compare(i1.start, i2.start);

        intervals.sort(c);

        int start = intervals.get(0).start;
        int end = intervals.get(0).end;
        for (Interval i : intervals) {
            if (i.start <= end) {
                end = Math.max(end, i.end);
            } else {
                res.add(new Interval(start, end));
                start = i.start;
                end = i.end;
            }
        }
        res.add(new Interval(start, end));
        return res;
    }
}

results matching ""

    No results matching ""