Skip to content

Commit 0b89e8c

Browse files
committed
Merge Intervals Solution
1 parent 617abb3 commit 0b89e8c

1 file changed

Lines changed: 40 additions & 0 deletions

File tree

merge-intervals/doh6077.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# 56. Merge Intervals
2+
3+
# First Try:
4+
# Time Complexity:O(N)
5+
# Brute Force with Two Pointers
6+
# 포인터를 사용해서 merge 해야하는 구간을 확인한다
7+
# 효율적이지 않아서 더 나은 방법이 있을 거 같다. 해당 문제를 봤을때 일단 기본적으로 정렬을 하고 pointer를 사용하는 방법을 떠올렸다.
8+
# merge 해야하는 구간은 2가지가 있다. 1. left의 end가 right의 start보다 크거나 같은 경우 2. left가 right의 구간을 전체를 다 포함하는경우 , 이경우 right를 지운다.
9+
class Solution:
10+
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
11+
# Use two pointers
12+
intervals = sorted(intervals)
13+
left, right = 0, 1
14+
n = len(intervals)
15+
while left < right and right < n:
16+
if intervals[left][1] >= intervals[right][0] and intervals[left][1] >= intervals[right][1]:
17+
del intervals[right]
18+
n = len(intervals)
19+
# and intervals[left][1] < intervals[right][1]
20+
elif intervals[left][1] >= intervals[right][0]:
21+
intervals[left] = [intervals[left][0], intervals[right][1]]
22+
del intervals[right]
23+
n = len(intervals)
24+
# merge 할 경우가 아니면 다음 인덱스로 넘어가서 새로 비교한다
25+
else:
26+
left += 1
27+
right += 1
28+
return intervals
29+
30+
# Optimized Solution
31+
intervals.sort(key=lambda interval: interval[0])
32+
merged = []
33+
34+
for interval in intervals:
35+
if not merged or merged[-1][1] < interval[0]:
36+
merged.append(interval)
37+
else:
38+
merged[-1] = [merged[-1][0], max(merged[-1][1], interval[1])]
39+
40+
return merged

0 commit comments

Comments
 (0)