435. 无重叠区间
这里使用的是右边界排序。注意这里的cmp函数如果参数不写为引用的形式就会超时!
class Solution {
public:
static bool cmp(vector<int> &a,vector<int> &b)
{
return a[1]<b[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int count=1;
sort(intervals.begin(),intervals.end(),cmp);
int end=intervals[0][1];
for(int i=1;i<intervals.size();i++)
{
if(intervals[i][0]>=end)
{
end=intervals[i][1];
count++;
}
}
return intervals.size()-count;
}
};
● 763.划分字母区间
这道题的想法非常的巧妙!我们把字母出现的位置想象成一个区间,那么我们分隔出的区间只能包括并集的情况而不能出现交集,所以我们只需要找到每个能够隔离开并集区间的右端点就好了!
class Solution {
public:
vector<int> partitionLabels(string s) {
vector<int> hash(26,0);
for(int i=0;i<s.size();i++)
{
hash[s[i]-'a']=i;
}
vector<int> result;
int right=0;
int left=0;
for(int i=0;i<s.size();i++)
{
right=max(right,hash[s[i]-'a']);
if(i==right)
{
result.push_back(right-left+1);
left=i+1;
}
}
return result;
}
};
● 56. 合并区间
和前几题的重叠区间求解思路很相似。先排序再比较。考虑一下区间为0的情况!在初始化right和left的时候要注意初始化为第一个区间!注意把最后一个区间塞进result。总之就是要考虑清楚边界情况!!!
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) {
vector<vector<int> > result;
if(intervals.size()==0)
return result;
sort(intervals.begin(),intervals.end());
int left=intervals[0][0];
int right=intervals[0][1];
for(int i=1;i<intervals.size();i++)
{
if(intervals[i][0]>right)
{
vector<int> tmp;
tmp.push_back(left);
tmp.push_back(right);
result.push_back(tmp);
left=intervals[i][0];
right=intervals[i][1];
}
else
{
right=max(right,intervals[i][1]);
}
}
vector<int> tmp;
tmp.push_back(left);
tmp.push_back(right);
result.push_back(tmp);
return result;
}
};