https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/description/

把每個 interval 排序,end 設定為 index=0 的尾巴

從 index=1 開始 loop,如果重疊,把尾巴設定為較短的那個

如果沒重疊, shoot ++,把尾巴設定為新的

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        if len(points) == 1:
            return 1

        sorted_points = sorted(points, key = lambda x: x[0])
        prev_end = sorted_points[0][1]
        shoot = 1

        for i in range(1, len(points)):
            point = sorted_points[i]
            if point[0] > prev_end:
                shoot += 1
                prev_end = point[1]
            else:
                prev_end = min(prev_end, point[1])

        return shoot

Time: O(n log n)

Space: O(1)