代码随想录算法训练营第三十天| 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 }

 

posted @ 2023-07-12 15:36  博二爷  阅读(2)  评论(0编辑  收藏  举报