Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 8b5ee67

Browse files
插入区间
1 parent 4f1afa9 commit 8b5ee67

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package com.leetcode_cn.hard;
2+
3+
import java.util.Arrays;
4+
5+
/******************插入区间***********/
6+
/**
7+
* 给出一个无重叠的 ,按照区间起始端点排序的区间列表。
8+
*
9+
* 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
10+
*
11+
* 示例 1:
12+
*
13+
* 输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
14+
*
15+
* 输出: [[1,5],[6,9]]
16+
*
17+
* 示例 2:
18+
*
19+
* 输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
20+
*
21+
* 输出: [[1,2],[3,10],[12,16]]
22+
*
23+
* 解释: 这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
24+
*
25+
* @author ffj
26+
*
27+
*/
28+
public class InsertInterval {
29+
public static void main(String[] args) {
30+
int[][] intervals = { { 1, 3 }, { 6, 9 } };
31+
int[] newInterval = { 2, 5 };
32+
int[][] result = new InsertInterval().insert(intervals, newInterval);
33+
System.out.println(result);
34+
}
35+
36+
public int[][] insert(int[][] intervals, int[] newInterval) {
37+
38+
int[][] retArr;
39+
40+
int newStart = newInterval[0];
41+
int newEnd = newInterval[1];
42+
int si = -1, ei = -1;
43+
boolean sFind = false, eFind = false;
44+
for (int i = 0; i < intervals.length; i++) {
45+
int[] item = intervals[i];
46+
int itemStart = item[0];
47+
int itemEnd = item[1];
48+
if (si == -1) {
49+
if (newStart <= itemEnd) {
50+
si = i;
51+
if (newStart >= itemStart) {
52+
sFind = true;
53+
}
54+
}
55+
}
56+
if (ei == -1) {
57+
if (newEnd <= itemEnd) {
58+
ei = i;
59+
if (newEnd >= itemStart) {
60+
eFind = true;
61+
}
62+
}
63+
}
64+
if (si != -1 && ei != -1) {
65+
break;
66+
}
67+
}
68+
// 插入or合并区间
69+
if (si == -1 && ei == -1) {
70+
// 插入最后
71+
retArr = Arrays.copyOf(intervals, intervals.length + 1);
72+
retArr[intervals.length] = new int[] { newStart, newEnd };
73+
} else if (si == ei) {
74+
int[] temp = new int[2];
75+
if (!sFind) {
76+
temp[0] = newStart;
77+
} else {
78+
temp[0] = intervals[si][0];
79+
}
80+
if (!eFind) {
81+
temp[1] = newEnd;
82+
} else {
83+
temp[1] = intervals[ei][1];
84+
}
85+
if (!sFind && !eFind) {
86+
// 新插入一个
87+
retArr = new int[intervals.length + 1][];
88+
int insetI = 0;
89+
for (int i = 0; i < intervals.length; i++) {
90+
if (i == si) {
91+
retArr[insetI] = temp;
92+
insetI++;
93+
}
94+
retArr[insetI] = intervals[i];
95+
insetI++;
96+
}
97+
} else {
98+
intervals[si] = temp;
99+
retArr = Arrays.copyOf(intervals, intervals.length);
100+
}
101+
} else {
102+
// 合并区间
103+
int skipStartI, skipEndI;
104+
int[] temp = new int[2];
105+
if (sFind) {
106+
temp[0] = intervals[si][0];
107+
skipStartI = si;
108+
} else {
109+
temp[0] = newStart;
110+
skipStartI = si;
111+
}
112+
if (eFind) {
113+
temp[1] = intervals[ei][1];
114+
skipEndI = ei;
115+
} else {
116+
temp[1] = newEnd;
117+
if (ei == -1) {
118+
skipEndI = intervals.length - 1;
119+
} else {
120+
skipEndI = ei - 1;
121+
}
122+
}
123+
int skip = skipEndI - skipStartI;
124+
retArr = new int[intervals.length - skip][];
125+
for (int i = 0; i < intervals.length; i++) {
126+
if (i < skipStartI) {
127+
retArr[i] = intervals[i];
128+
} else if (i >= skipStartI && i <= skipEndI) {
129+
if (i == skipStartI) {
130+
retArr[skipStartI] = temp;
131+
}
132+
} else {
133+
retArr[i - skip] = intervals[i];
134+
}
135+
}
136+
}
137+
return retArr;
138+
}
139+
140+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /