From 3b89e8060d1820f5932724b0d073926e66712027 Mon Sep 17 00:00:00 2001 From: asahi Date: Wed, 28 May 2025 12:56:28 +0800 Subject: [PATCH] =?UTF-8?q?leetcode=2057=20=E9=87=8D=E5=8F=A0=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 57.insert-interval.java | 112 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 57.insert-interval.java diff --git a/57.insert-interval.java b/57.insert-interval.java new file mode 100644 index 0000000..517cc42 --- /dev/null +++ b/57.insert-interval.java @@ -0,0 +1,112 @@ +/* + * @lc app=leetcode id=57 lang=java + * + * [57] Insert Interval + */ + +// @lc code=start + +import java.util.ArrayList; + +class Solution { + public int[][] insert(int[][] intervals, int[] newInterval) { + return insertSpecific(intervals, newInterval); + } + + public int[][] insertSpecific(int[][] intervals, int[] newInterval) { + List list = new ArrayList<>(); + boolean appended = false; + for(int[] interval : intervals) { + if(appended) { + list.add(interval); + } else { + if(!isIntervalsOverfliped(interval, newInterval)) { + // list.add(interval); + if(newInterval[0] < interval[0]) { + appended = true; + list.add(newInterval); + list.add(interval); + } else { + list.add(interval); + } + } else { + newInterval = joinIntervals(newInterval, interval); + } + } + } + if(!appended) { + list.add(newInterval); + } + // build ret + int[][] r = new int[list.size()][2]; + for(int i = 0; i< list.size(); i++) { + r[i][0] = list.get(i)[0]; + r[i][1] = list.get(i)[1]; + } + return r; + } + + private boolean isIntervalsOverfliped(int[] i1, int[] i2) { + return !(i1[0] > i2[1] || i1[1] < i2[0]); + } + + private int[] joinIntervals(int[] i1, int[] i2) { + int[] r = new int[2]; + r[0] = Math.min(i1[0], i2[0]); + r[1] = Math.max(i1[1], i2[1]); + return r; + } + + public int[][] insertCommon(int[][] intervals, int[] newInterval) { + List edges = new ArrayList<>(); + for(int i = 0; i < intervals.length; i++) { + edges.add(new End(intervals[i][0], true)); + edges.add(new End(intervals[i][1], false)); + } + edges.add(new End(newInterval[0], true)); + edges.add(new End(newInterval[1], false)); + edges.sort((a, b)->{ + if(a.pos!=b.pos) { + return a.pos - b.pos; + } + return (a.isStart?0:1) - (b.isStart?0:1); + }); + List r = new ArrayList(); + int c = 0, f=0; + for(End e: edges) { + if(c == 0) { + if(!e.isStart) { + throw new RuntimeException("invalid input"); + } + c++; + f = e.pos; + } else { + if(e.isStart) { + c++; + } else { + c--; + if(c == 0) { + r.add(new int[]{f, e.pos}); + } + } + } + } + int[][] ra = new int[r.size()][2]; + for(int i=0; i