สมมติว่าเรามีรายการตัวเลข 2 มิติที่เรียกว่าช่วง ซึ่งแต่ละแถวแสดงถึงช่วง [เริ่ม สิ้นสุด] (รวม) สำหรับช่วงเวลา [a, b] (a
ดังนั้น หากอินพุตเป็นเหมือนช่วง =[[15, 20],[30, 50]] ผลลัพธ์จะเป็น 10 เนื่องจากเราสามารถเพิ่มช่วงเวลา [20, 30] ซึ่งเป็นช่วงที่เล็กที่สุดได้พี>
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- เหตุการณ์ :=รายการใหม่
- สำหรับเวลาเริ่มต้นและสิ้นสุดแต่ละครั้ง e ในช่วงเวลา ทำ
- แทรก (s, 1) ที่ส่วนท้ายของกิจกรรม
- แทรก (e, -1) ต่อท้ายกิจกรรม
- จัดเรียงรายการกิจกรรม
- curr_status :=0, สุดท้าย :=null
- ช่วงเวลา :=คู่ [0, 0]
- สำหรับแต่ละคู่ (เวลา สถานะ) ในเหตุการณ์ ทำ
- ถ้า curr_status เหมือนกับ 0 และ last and time> สุดท้าย
- ถ้า interval[0] เท่ากับ 0 แล้ว
- ช่วงเวลา[0] :=สุดท้าย
- ช่วงเวลา[1] :=เวลา
- ถ้า interval[0] เท่ากับ 0 แล้ว
- สุดท้าย :=เวลา
- curr_status :=curr_status + สถานะ
- ถ้า curr_status เหมือนกับ 0 และ last and time> สุดท้าย
- ช่วงกลับ[1] - ช่วง[0]
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
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))
อินพุต
[[15, 20],[30, 50]]
ผลลัพธ์
10