435. 无重叠区间
class Solution {
private:
static bool cmp(const vector<int>& a,vector<int>& b)
{
return a[0]<b[0];
}
public:
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],intervals[i-1][1]);
}
}
return result;
}
};
763.划分字母区间
//哈希表统计字母最远出现的地方nums[s[i]-'a'],即为统计
class Solution {
public:
vector<int> partitionLabels(string s) {
int nums[27]={0};//为于统计每个字母最远的下标,nums[0],代表字母a
for(int i=0;i<s.size();i++)
{
nums[s[i]-'a'] = i;
}
vector<int> result;
int left = 0;
int right = 0;
for(int i=0;i<s.size();i++)
{
right = max(nums[s[i]-'a'],right);//例如在找寻第一个字母下标最远的过程中,我们会遇到其他字母的最后下标
if(i==right)
{
result.push_back(right-left+1);
left = i + 1;
}
}
return result;
}
};
56. 合并区间
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;
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(intervals[i][1],result.back()[1]);
}
else
{
result.push_back(intervals[i]);
}
}
return result;
}
};