สมมติว่าเรามีลิสต์ 2 มิติ intervals แต่ละแถวคือ [start, end] (รวม) สำหรับช่วง [a, b] (a < b) ขนาดคือ (b - a) เราต้องเพิ่มช่วงหนึ่งช่วงเข้าไปในลิสต์ ที่ทำให้หลังรวมช่วงทั้งหมดได้ช่วงเดียวพอดี หาขนาดน้อยที่สุดของช่วงที่เพิ่ม
ตัวอย่าง: intervals = [[15, 20], [30, 50]] ผลลัพธ์คือ 10 เพราะเพิ่ม [20, 30] ได้ขนาด 10
ขั้นตอนการแก้ปัญหา (Sweep Line)
- สร้างลิสต์
eventsว่าง - สำหรับแต่ละ
(s, e)ในintervals:- เพิ่ม
(s, 1)เข้าevents - เพิ่ม
(e, -1)เข้าevents
- เพิ่ม
- เรียงลำดับ
events curr_status = 0,last = None,interval = [0, 0]- สำหรับแต่ละ
(time, status)ในevents:- ถ้า
curr_status == 0และlastมีค่า และtime > last:- ถ้า
interval[0] == 0:interval[0] = last interval[1] = time
- ถ้า
last = timecurr_status += status
- ถ้า
- คืนค่า
interval[1] - interval[0]
ตัวอย่างโค้ด Python
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
อินพุต / เอาต์พุต
Input: [[15, 20], [30, 50]]
Output: 10