# **程式筆記(Intervals)** :::info :information_source: 日期 : 2023/07/25 ::: **:thumbsup:** 通則 intervals四點 1. 要.sort() 2. 不管有沒有overlap都要更新preEnd 3. 要看"剛好overlap"這點的條件 4. 改end要用res[-1][1] ```python 有重疊 if 舊(x)尾 >= 新進(x + 1)頭 ``` list.sort() 直接修改原始list sorted() 不影響原始list ```python # 使用 list.sort() my_list = [3, 1, 4] my_list.sort() print(my_list) # Output: [1, 3, 4] # 使用 sorted() my_list = [3, 1, 4] sorted_list = sorted(my_list) print(sorted_list) # Output: [1, 3, 4] print(my_list) # Output: [3, 1, 4] ``` lambda ```python # 小到大 根據第一個element排序 intervals.sort(key=lambda x: x[0]) # 倒敘 大到小 intervals.sort(key=lambda x: x[0], reverse=True) # 根據多個值去排序 intervals.sort(key=lambda x: (x[0], x[1])) # 不改變原始列表 sorted_intervals = sorted(intervals, key=lambda x: x[0]) ``` --- **:thumbsup:題解** **Intervals** * Merge Intervals(合併區間) ```python class Solution: def merge(self, intervals: List[List[int]]) -> List[List[int]]: intervals.sort(key=lambda x:x[0]) res = [intervals[0]] for start, end in intervals[1:]: if start <= res[-1][1]: res[-1][1] = max(res[-1][1], end) else: res.append([start, end]) return res ``` * Non-overlapping Intervals(非重疊區間) minimum number of intervals you need to remove to make the rest of the intervals non-overlapping ```python class Solution: def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int: intervals.sort(key = lambda x : x[0]) preEnd = intervals[0][1] res = 0 for start, end in intervals[1:]: if start < preEnd: preEnd = min(preEnd, end) res += 1 else: preEnd = end return res ``` * Insert Interval(插入區間) 三種情況 ``` 1. if not overlap : interval[1] < new[0] # interval __ new res.append(interval) 2. if not overlap : new[1] < interval[0] # new __ interval res.append(new) return res + interval[i:] # never overlap anymore 3. if overlap: new[0] = min(interval[0], new[0]) new[1] = max(interval[1], new[1]) ``` ```python class Solution: def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]: res = [] for i, interval in enumerate(intervals): if interval[1] < newInterval[0]: # interval __ new res.append(interval) elif newInterval[1] < interval[0]: # new __ interval res.append(newInterval) return res + intervals[i:] # never overlap anymore else: newInterval[0] = min(interval[0], newInterval[0]) newInterval[1] = max(interval[1], newInterval[1]) res.append(newInterval) return res ``` * Interval List Intersections 保留住最大的那個區間,進下一輪比較。上面條件是and,最後一輪停在最大與次大,並且由最大勝出,即可終止 ```python class Solution: def intervalIntersection(self, firstList: List[List[int]], secondList: List[List[int]]) -> List[List[int]]: intersection = [] i, j = 0, 0 while i < len(firstList) and j < len(secondList): s_i, e_i = firstList[i][0], firstList[i][1] s_j, e_j = secondList[j][0], secondList[j][1] s_max = max(s_i, s_j) e_min = min(e_i, e_j) if s_max <= e_min: intersection.append([s_max, e_min]) if e_i < e_j: i += 1 else: j += 1 return intersection ``` **Meeting Rooms** * Meeting Rooms 重疊 -> F / 不重疊 -> T ```python class Solution: def canAttendMeetings(self, intervals: List[List[int]]) -> bool: if not intervals: return True intervals.sort(key = lambda x : x[0]) preEnd = intervals[0][1] for start, end in intervals[1:]: if preEnd > start: return False else: preEnd = end return True ``` * Meeting Rooms II 垂直向上看數線的最大重疊數量 ```python class Solution: def minMeetingRooms(self, intervals: List[List[int]]) -> int: res, rooms = 0, 0 record = collections.defaultdict(int) for start, end in intervals: record[start] += 1 record[end] -= 1 keys = dict(sorted(record.items(), key = lambda item : item[0])).keys() for key in keys: rooms += record[key] res = max(res, rooms) return res ``` * Minimum Number of Arrows to Burst Balloons 先初始化一根劍,不停的更新尾端,當上次尾端和這次的開頭重疊,代表interval重疊可以一劍射穿,取最小的ending去更新 不用紀錄start,因為不會被拿進來比較 初始化1是因為第一個element ```python class Solution: def findMinArrowShots(self, points: List[List[int]]) -> int: points = sorted(points) count = 1 # preStart = points[0][0] preEnd = points[0][1] for start, end in points: if start <= preEnd: # overlapped # preStart = max(preStart, start) preEnd = min(preEnd, end) else: count += 1 # preStart = start preEnd = end return count ``` --- **講解連結** Provided by. ###### tags: `arrays` `note` `code`