代码随想录算法训练营第三十八天
435. 无重叠区间
题目链接:435. 无重叠区间
先排序,两个区间有重叠就删一个,要删右边界比较大的,保留右边界较小的。这样才能保证删除最少得区间
class Solution {
public:
static bool cmp(vector<int> a, vector<int> b) { return a[0] < b[0]; }
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);
int result =0;
for (int i = 1; i < intervals.size(); i++) {
if(intervals[i][0]<intervals[i-1][1]){
result++;
intervals[i][1]=min(intervals[i-1][1],intervals[i][1]);//找右边界的最小值作为下次比较的右边界,大的那个就是要删除的区间的有边界
}
}
return result;
}
};
763.划分字母区间
题目链接:763.划分字母区间
class Solution {
public:
vector<int> partitionLabels(string s) {
int hash[26] = {0};
int max_num = 0;
vector<int>result;
int left =0;
for(int i =0;i<s.size();i++){
hash[s[i] - 'a'] = i;
}//将26个字母出现的最后下标记录下来
for(int i =0;i<s.size();i++){
max_num = max(max_num,hash[s[i] - 'a']);
if(i==max_num){//遍历字符串,当当前字符的下标等于前面遍历过所有字母出现的最后下标时,证明后面没有再出现过前面这堆字母,可以开始分割了
result.push_back(i+1-left);
left = i+1;
}
}
return result;
}
};
56. 合并区间
题目链接:56. 合并区间
class Solution {
public:
static bool cmp(vector<int> a, vector<int> b) { return a[0] < b[0]; }
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.empty()) {
return {};
}
sort(intervals.begin(), intervals.end(), cmp);
vector<vector<int>> result;
result.push_back(intervals[0]);
for (int i = 1; i < intervals.size(); i++) {
if (intervals[i][0] <= result.back()[1]) {//区间有重叠,更新下右边界,右边界尽可能大,覆盖最大的范围
result.back()[1] = max(result.back()[1], intervals[i][1]);
} else {//没有重叠,就把当前区间加到结果里
result.push_back(intervals[i]);
}
}
return result;
}
};