Skip to content

Commit d436d8e

Browse files
committed
56. Merge Intervals
1 parent 93d7770 commit d436d8e

File tree

4 files changed

+271
-0
lines changed

4 files changed

+271
-0
lines changed

markdown/56. Merge Intervals.md

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
### [56\. Merge Intervals](https://leetcode.com/problems/merge-intervals/)
2+
3+
Difficulty: **Medium**
4+
5+
6+
Given a collection of intervals, merge all overlapping intervals.
7+
8+
**Example 1:**
9+
10+
```
11+
Input: [[1,3],[2,6],[8,10],[15,18]]
12+
Output: [[1,6],[8,10],[15,18]]
13+
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
14+
```
15+
16+
**Example 2:**
17+
18+
```
19+
Input: [[1,4],[4,5]]
20+
Output: [[1,5]]
21+
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
22+
```
23+
24+
**NOTE:** input types have been changed on April 15, 2019\. Please reset to default code definition to get new method signature.
25+
26+
27+
#### Solution B
28+
29+
Language: **Java**
30+
31+
```java
32+
class Solution {
33+
public int[][] merge(int[][] intervals) {
34+
List<int[]> result = new ArrayList<>();
35+
if (intervals == null || intervals.length == 0) {
36+
return result.toArray(new int[result.size()][]);
37+
}
38+
Arrays.sort(intervals, Comparator.comparingInt(i -> i[0]));
39+
// key 是数组的值,value 表示这个是左还是右,左为-1,右为1,如果都有,则求和
40+
Map<Integer, Integer> map = new TreeMap<>();
41+
for (int i = 0; i < intervals.length; i++) {
42+
int left = intervals[i][0];
43+
if (map.containsKey(left)) {
44+
map.put(left, map.get(left) - 1);
45+
} else {
46+
map.put(left, -1);
47+
}
48+
int right = intervals[i][1];
49+
if (map.containsKey(right)) {
50+
map.put(right, map.get(right) + 1);
51+
} else {
52+
map.put(right, 1);
53+
}
54+
}
55+
int[] interval = new int[2];
56+
interval[0] = intervals[0][0];
57+
int i = 0;
58+
for (Integer integer : map.keySet()) {
59+
if (i == 0) {
60+
interval = new int[2];
61+
interval[0] = integer;
62+
}
63+
i += map.get(integer);
64+
if (i == 0) {
65+
interval[1] = integer;
66+
result.add(interval);
67+
}
68+
}
69+
return result.toArray(new int[result.size()][]);
70+
}
71+
}
72+
73+
```
74+
#### Solution B
75+
76+
Language: **Java**
77+
78+
```java
79+
class Solution {
80+
public int[][] merge(int[][] intervals) {
81+
if (intervals.length <= 1)
82+
return intervals;
83+
84+
// Sort by ascending starting point
85+
Arrays.sort(intervals, (i1, i2) -> Integer.compare(i1[0], i2[0]));
86+
87+
List<int[]> result = new ArrayList<>();
88+
int[] newInterval = intervals[0];
89+
result.add(newInterval);
90+
for (int[] interval : intervals) {
91+
if (interval[0] <= newInterval[1]) // Overlapping intervals, move the end if needed
92+
newInterval[1] = Math.max(newInterval[1], interval[1]);
93+
else { // Disjoint intervals, add the new interval to the list
94+
newInterval = interval;
95+
result.add(newInterval);
96+
}
97+
}
98+
return result.toArray(new int[result.size()][]);
99+
}
100+
}
101+
```
102+
103+
![](http://ww2.sinaimg.cn/large/006tNc79ly1g4xeakhdjej31010u07bt.jpg)

src/main/java/leetcode/_56_/Main.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package leetcode._56_;
2+
3+
/**
4+
* Created by zhangbo54 on 2019-03-04.
5+
*/
6+
public class Main {
7+
public static void main(String[] args) {
8+
Solution solution = new Solution();
9+
int[][] intervals = {{1, 3}, {8, 10}, {15, 18}, {2, 6}};
10+
// int[][] merge = solution.merge(intervals);
11+
// System.out.println(merge);
12+
int[][] intervals2 = {{1, 4}, {1, 4}};
13+
solution.merge(intervals2);
14+
}
15+
}
16+
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package leetcode._56_;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.Comparator;
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.TreeMap;
9+
10+
class Solution {
11+
public int[][] merge(int[][] intervals) {
12+
List<int[]> result = new ArrayList<>();
13+
if (intervals == null || intervals.length == 0) {
14+
return result.toArray(new int[result.size()][]);
15+
}
16+
Arrays.sort(intervals, Comparator.comparingInt(i -> i[0]));
17+
// key 是数组的值,value 表示这个是左还是右,左为-1,右为1,如果都有,则求和
18+
Map<Integer, Integer> map = new TreeMap<>();
19+
for (int i = 0; i < intervals.length; i++) {
20+
int left = intervals[i][0];
21+
if (map.containsKey(left)) {
22+
map.put(left, map.get(left) - 1);
23+
} else {
24+
map.put(left, -1);
25+
}
26+
int right = intervals[i][1];
27+
if (map.containsKey(right)) {
28+
map.put(right, map.get(right) + 1);
29+
} else {
30+
map.put(right, 1);
31+
}
32+
}
33+
int[] interval = new int[2];
34+
interval[0] = intervals[0][0];
35+
int i = 0;
36+
for (Integer integer : map.keySet()) {
37+
if (i == 0) {
38+
interval = new int[2];
39+
interval[0] = integer;
40+
}
41+
i += map.get(integer);
42+
if (i == 0) {
43+
interval[1] = integer;
44+
result.add(interval);
45+
}
46+
}
47+
return result.toArray(new int[result.size()][]);
48+
}
49+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
### [56\. Merge Intervals](https://leetcode.com/problems/merge-intervals/)
2+
3+
Difficulty: **Medium**
4+
5+
6+
Given a collection of intervals, merge all overlapping intervals.
7+
8+
**Example 1:**
9+
10+
```
11+
Input: [[1,3],[2,6],[8,10],[15,18]]
12+
Output: [[1,6],[8,10],[15,18]]
13+
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
14+
```
15+
16+
**Example 2:**
17+
18+
```
19+
Input: [[1,4],[4,5]]
20+
Output: [[1,5]]
21+
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
22+
```
23+
24+
**NOTE:** input types have been changed on April 15, 2019\. Please reset to default code definition to get new method signature.
25+
26+
27+
#### Solution B
28+
29+
Language: **Java**
30+
31+
```java
32+
class Solution {
33+
public int[][] merge(int[][] intervals) {
34+
List<int[]> result = new ArrayList<>();
35+
if (intervals == null || intervals.length == 0) {
36+
return result.toArray(new int[result.size()][]);
37+
}
38+
Arrays.sort(intervals, Comparator.comparingInt(i -> i[0]));
39+
// key 是数组的值,value 表示这个是左还是右,左为-1,右为1,如果都有,则求和
40+
Map<Integer, Integer> map = new TreeMap<>();
41+
for (int i = 0; i < intervals.length; i++) {
42+
int left = intervals[i][0];
43+
if (map.containsKey(left)) {
44+
map.put(left, map.get(left) - 1);
45+
} else {
46+
map.put(left, -1);
47+
}
48+
int right = intervals[i][1];
49+
if (map.containsKey(right)) {
50+
map.put(right, map.get(right) + 1);
51+
} else {
52+
map.put(right, 1);
53+
}
54+
}
55+
int[] interval = new int[2];
56+
interval[0] = intervals[0][0];
57+
int i = 0;
58+
for (Integer integer : map.keySet()) {
59+
if (i == 0) {
60+
interval = new int[2];
61+
interval[0] = integer;
62+
}
63+
i += map.get(integer);
64+
if (i == 0) {
65+
interval[1] = integer;
66+
result.add(interval);
67+
}
68+
}
69+
return result.toArray(new int[result.size()][]);
70+
}
71+
}
72+
73+
```
74+
#### Solution B
75+
76+
Language: **Java**
77+
78+
```java
79+
class Solution {
80+
public int[][] merge(int[][] intervals) {
81+
if (intervals.length <= 1)
82+
return intervals;
83+
84+
// Sort by ascending starting point
85+
Arrays.sort(intervals, (i1, i2) -> Integer.compare(i1[0], i2[0]));
86+
87+
List<int[]> result = new ArrayList<>();
88+
int[] newInterval = intervals[0];
89+
result.add(newInterval);
90+
for (int[] interval : intervals) {
91+
if (interval[0] <= newInterval[1]) // Overlapping intervals, move the end if needed
92+
newInterval[1] = Math.max(newInterval[1], interval[1]);
93+
else { // Disjoint intervals, add the new interval to the list
94+
newInterval = interval;
95+
result.add(newInterval);
96+
}
97+
}
98+
return result.toArray(new int[result.size()][]);
99+
}
100+
}
101+
```
102+
103+
![](http://ww2.sinaimg.cn/large/006tNc79ly1g4xeakhdjej31010u07bt.jpg)

0 commit comments

Comments
 (0)