代码随想录算法训练营第三十天| 435. 无重叠区间 763.划分字母区间 56. 合并区间
435. 无重叠区间
要求:
给了多个区间,然后找出来删掉最少的区间数,从而可以让上下的区间不重叠
换个想法:
当前节点和上一个节点如果重叠,那么我就+1,然后缩小上一个节点,如果还是跟上一个节点重叠,那么就证明这个节点也要删除
小技巧:
lamda函数不好用,每次比较的时候都会在定义一个cmp函数,需要在外部定义,更方便
代码:
1 int eraseOverlapIntervals(vector<vector<int>>& intervals) { 2 if (intervals.size() == 0) return 0; 3 4 sort(intervals.begin(), intervals.end(), [](vector<int>&a, vector<int>&b) {return a[0]<b[0]; }); 5 int result = 0; 6 7 for (int i = 1; i < intervals.size(); i++) 8 { 9 if (intervals[i][0] < intervals[i - 1][1]) 10 { 11 result++; 12 intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]); 13 } 14 } 15 16 return result; 17 }
763.划分字母区间
思路:
1,先对每个字母制造他们的字母区间
2,拓宽区间范围
代码:
1 vector<int> partitionLabels(string s) { 2 vector<int> result; 3 if (s.size() == 0) return result; 4 5 set<char> selected; 6 vector<vector<int>> scopes; 7 for (int i = 0; i < s.size(); i++) 8 { 9 if (selected.find(s[i]) == selected.end()) 10 { 11 vector<int> scope; 12 scope.push_back(i); 13 for (int j = s.size()-1; j >= i; j--) 14 { 15 if (s[j] == s[i]) 16 { 17 scope.push_back(j); 18 break; 19 } 20 } 21 22 selected.insert(s[i]); 23 scopes.push_back( scope); 24 } 25 } 26 27 vector<int> scope = scopes[0]; 28 result.push_back(scope[1]-scope[0]+1); 29 // 遍历搜索过的节点,如果当前节点在前一个里面,那么就扩充,然后result++ 30 for (int i = 1; i < scopes.size(); i++) 31 { 32 if (scopes[i][0] < scope[1] && scopes[i][0]>scope[0]) 33 { 34 scope[1] = max(scopes[i][1], scope[1]); 35 result.back() = scope[1] - scope[0] + 1; 36 } 37 else 38 { 39 scope = scopes[i]; 40 result.push_back(scope[1] - scope[0] + 1); 41 } 42 } 43 44 return result; 45 }
56. 合并区间
思路:
如果在里面,就拓宽
代码:
1 static bool CMP_merge(vector<int>& a, vector<int>& b) 2 { 3 return a[0] < b[0]; 4 } 5 vector<vector<int>> merge(vector<vector<int>>& intervals) { 6 vector<vector<int>> result; 7 if (intervals.size() == 0) return intervals; 8 9 sort(intervals.begin(), intervals.end(), CMP_merge); 10 11 result.push_back(intervals[0]); 12 for (int i = 1; i < intervals.size(); i++) 13 { 14 if (intervals[i][0] <= result.back()[1] && intervals[i][0] >= result.back()[0]) 15 { 16 result.back()[1] = max(result.back()[1], intervals[i][1]); 17 } 18 else 19 { 20 result.push_back(intervals[i]); 21 } 22 } 23 24 return result; 25 }