###### tags: `Leetcode` `medium` `greedy` `sort` `array` `python` `c++` # 435. Non-overlapping Intervals ## [題目連結:] https://leetcode.com/problems/non-overlapping-intervals/description/ ## 題目: Given an array of intervals ```intervals``` where ```intervals[i] = [starti, endi]```, return the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping. **Example 1:** ``` Input: intervals = [[1,2],[2,3],[3,4],[1,3]] Output: 1 Explanation: [1,3] can be removed and the rest of the intervals are non-overlapping. ``` **Example 2:** ``` Input: intervals = [[1,2],[1,2],[1,2]] Output: 2 Explanation: You need to remove two [1,2] to make the rest of the intervals non-overlapping. ``` **Example 3:** ``` Input: intervals = [[1,2],[2,3]] Output: 0 Explanation: You don't need to remove any of the intervals since they're already non-overlapping. ``` ## 解題想法: * 此題為給一堆區間,求需要移除多少區間可使得剩下的區間皆沒重疊 * Greedy: * **需先排序好** * head=intervals[0][1] * 作為比較的對象 * 取區間**右邊**的值 * for遍歷所有區間 * 分別查看當前區間**左邊**的值 * Case1: 若小於head * 表示遇到重疊了 * 則需更新head,min(head,intervals[i][1]) * 且res+=1,表示目前的head與interval[i]兩者有一個可以被刪掉 * Case2: 大於等於head * 表示沒重疊 * 移動head繼續往後遍歷 ## Python: ``` python= class Solution(object): def eraseOverlapIntervals(self, intervals): """ :type intervals: List[List[int]] :rtype: int """ if len(intervals)==0: return 0 intervals.sort() head=intervals[0][1] #取[1,2]中的'2' res=0 #可刪掉的數量 for i in range(1,len(intervals)): #往後找 看其左邊的值: 若小於head 則代表重疊了 if intervals[i][0]<head: head=min(head,intervals[i][1]) #選右邊最小的當head res+=1 #目前的head與interval[i]兩者有一個可以被刪掉 else: #沒重疊 移動head繼續找 head=intervals[i][1] return res result=Solution() intervals = [[1,2],[2,3],[3,4],[1,3]] ans=result.eraseOverlapIntervals(intervals) print(ans) ``` ## C++: ``` cpp= class Solution { public: int eraseOverlapIntervals(vector<vector<int>>& intervals) { sort(intervals.begin(), intervals.end()); int head=intervals[0][1], res=0; for (int i=1; i<intervals.size(); i++){ if (intervals[i][0]<head){ res+=1; head=min(head, intervals[i][1]); } else head=intervals[i][1]; } return res; } }; ```