Giả sử chúng ta có một tập hợp các khoảng, cần hợp nhất tất cả các khoảng chồng chéo. Ví dụ, nếu các khoảng là [[1,3], [2,6], [8,10], [15,18]], sau khi hợp nhất sẽ là [[1,6],[8,10],[15,18]]. Điều này do hai khoảng [1,3] và [2,6] chồng chéo, được hợp nhất thành [1,6].
Các bước thực hiện
- Nếu danh sách khoảng rỗng, trả về danh sách rỗng.
- Sắp xếp danh sách khoảng bằng thuật toán quicksort.
stack:= ngăn xếp rỗng, đưaintervals[0]vào ngăn xếp.- Với
itừ 1 đến độ dàiintervals- 1:last_element:= phần tử đỉnh ngăn xếp.- Nếu cuối của
last_element>= đầu củaintervals[i]:- Cập nhật cuối của
last_element= max(cuối củaintervals[i], cuối củalast_element). - Lấy phần tử ra khỏi ngăn xếp.
- Đưa
last_elementtrở lại ngăn xếp.
- Cập nhật cuối của
- Ngược lại đưa
intervals[i]vào ngăn xếp.
- Trả về ngăn xếp.
Ví dụ minh họa
class Solution(object):
def merge(self, intervals):
if len(intervals) == 0:
return []
self.quicksort(intervals, 0, len(intervals)-1)
stack = []
stack.append(intervals[0])
for i in range(1, len(intervals)):
last_element = stack[len(stack)-1]
if last_element[1] >= intervals[i][0]:
last_element[1] = max(intervals[i][1], last_element[1])
stack.pop(len(stack)-1)
stack.append(last_element)
else:
stack.append(intervals[i])
return stack
def partition(self, array, start, end):
pivot_index = start
for i in range(start, end):
if array[i][0] <= array[end][0]:
array[i], array[pivot_index] = array[pivot_index], array[i]
pivot_index += 1
array[end], array[pivot_index] = array[pivot_index], array[end]
return pivot_index
def quicksort(self, array, start, end):
if start < end:
partition_index = self.partition(array, start, end)
self.quicksort(array, start, partition_index-1)
self.quicksort(array, partition_index + 1, end)
ob1 = Solution()
print(ob1.merge([[1,3],[2,6],[8,10],[15,18]]))
Đầu vào
[[1,3],[2,6],[8,10],[15,18]]
Đầu ra
[[1, 6], [8, 10], [15, 18]]