435.无重叠区间
局部最优:重叠区间删掉;
全局最优:最少删掉重叠区间
按照右边界进行排序,设置end为非重叠边界,初始化为第一个区间的右边界,当end与遍历到的区间左边界不重叠(小于),更新end为该遍历到的区间的右边界,count++,计算非重叠区间数量,用总数减去即可。
class Solution
{
private:
static bool cmp(const vector<int> &a, const vector<int> &b)
{
return a[1] < b[1];
}
public:
int eraseOverlapIntervals(vector<vector<int>> &intervals)
{
if (intervals.size() == 0)
return 0;
sort(intervals.begin(), intervals.end(), cmp);
int count = 1;
int end = intervals[0][1];
for (int i = 1; i < intervals.size();i++){
if(end<=intervals[i][0]){
end = intervals[i][1];
count++;
}
}
return intervals.size() - count;
}
};
763.划分字母区间
思路:为每个字符的第一次出现设置为区间左边界,最后一次出现设置为区间右边界,,这样将题目转化成公共区间问题,但是与435不同的是,不能排序。
为每个字符编号,然后不断更新他们形成的区间右边界,
for(int i = 0; i <s.size(); i++) {
hash[s[i] - 'a'] = i;
}
找到右边界后更新左边界,并把相关记录入result中:
if(right==i){
result.push_back(right - left + 1);
left = i + 1;
}
class Solution {
public:
vector<int> partitionLabels(string s) {
int hash[27] = {0};
for(int i = 0; i <s.size(); i++) {
hash[s[i] - 'a'] = i;
}
vector<int> result;
int left = 0;
int right = 0;
for (int i = 0; i < s.size();i++){
right=max(right,hash[s[i] - 'a']);
if(right==i){
result.push_back(right - left + 1);
left = i + 1;
}
}
return result;
}
};
56. 合并区间
思路:将i区间右边界和i+1区间左边界进行比较,有重叠的话采用两个区间的右边界最大值作为重叠区间的右边界,直到没重叠就result添加进去;
class Solution {
private:
static bool cmp(const vector<int>& a, const vector<int>& b){
return a[0] < b[0];
}
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> result;
if(intervals.size()==0){
return result;
}
sort(intervals.begin(), intervals.end(), cmp);
result.push_back(intervals[0]);
for (int i = 1; i < intervals.size();i++){
if (result.back()[1]>=intervals[i][0]){
result.back()[1] = max(result.back()[1], intervals[i][1]);
}else{
result.push_back(intervals[i]);
}
}
return result;
}
};