Cho danh sách 2D intervals mỗi hàng là [start, end] (bao gồm cả hai). Kích thước khoảng [a, b] là b - a. Cần thêm một khoảng vào danh sách sao cho sau khi hợp nhất tất cả các khoảng, chỉ còn lại đúng một khoảng. Tìm kích thước nhỏ nhất của khoảng thêm vào.
Ví dụ: intervals = [[15, 20], [30, 50]] → 10 (thêm [20, 30]).
Quy trình giải quyết (Sweep Line)
- Tạo danh sách sự kiện
events: với mỗi(s, e)thêm(s, 1)và(e, -1). - Sắp xếp
events. - Duyệt sự kiện, giữ
curr_status(số khoảng đang hoạt động) vàlast(thời điểm trước). - Khi
curr_status == 0vàlasttồn tại vàtime > last: cập nhật khoảng trốnginterval. - Trả về
interval[1] - interval[0].
Ví dụ mã nguồn
class Solution:
def solve(self, intervals):
events = []
for s, e in intervals:
events.append((s, 1))
events.append((e, -1))
events.sort()
curr_status = 0
last = None
interval = [0, 0]
for time, status in events:
if curr_status == 0 and last and time > last:
if interval[0] == 0:
interval[0] = last
interval[1] = time
last = time
curr_status += status
return interval[1] - interval[0]
ob = Solution()
intervals = [[15, 20], [30, 50]]
print(ob.solve(intervals)) # Output: 10
Đầu vào
[[15, 20], [30, 50]]
Đầu ra
10