Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Merge Intervals ใน Python - รวมช่วงที่ทับซ้อนกัน

สมมติว่าเรามีชุดของช่วง (intervals) เราต้องรวมช่วงที่ทับซ้อนกันทั้งหมด ตัวอย่างเช่น ถ้าช่วงคือ [[1,3], [2,6], [8,10], [15,18]] หลังจากรวมแล้วจะได้ [[1,6], [8,10], [15,18]] เนื่องจากช่วง [1,3] และ [2,6] ทับซ้อนกัน จึงรวมเป็น [1,6]

ขั้นตอนการทำงาน

  1. ถ้ารายการช่วงว่าง ให้คืนค่ารายการว่าง
  2. จัดเรียงรายการช่วงโดยใช้ quicksort
  3. สร้างสแต็กว่าง ใส่ intervals[0] ลงไป
  4. วนลูป i จาก 1 ถึง ความยาวของ intervals - 1:
    • last_element := top element of stack
    • ถ้า end of last_element >= first element of intervals[i]:
      • end of last_element = max(end of intervals[i], end of last_element)
      • นำ last_element ออกจากสแต็ก แล้วใส่กลับเข้าไป
    • มิฉะนั้น ใส่ intervals[i] ลงในสแต็ก
  5. คืนค่าสแต็ก

ตัวอย่างโค้ด

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]]))

อินพุต

[[1,3],[2,6],[8,10],[15,18]]

เอาต์พุต

[[1, 6], [8, 10], [15, 18]]