本题要求移除区间的最小数量,首先要将区间进行排序,将后序区间的左边界与前序区间的右边界比较,如果有交集则需要移除一个区间,并将后序区间的右边界变为二者的最小值以便进行下一次比较。
具体代码如下:
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],intervals[i-1][1]);
}
}
return result;
}
};
本题要划分字母区间,首先要在hash数组里记录字母最远出现的位置,而后遍历给定字符串,将右边界取当前右边界和当前字母右边界的最大值,当遍历到当前右边界时,说明区间划分完成,将长度加入结果数组并重置左边界。
具体代码如下:
class Solution {
public:
vector<int> partitionLabels(string s) {
int hash[27]={0};
for(int i=0;i<s.length();i++)
{
hash[s[i]-'a']=i;
}
vector<int>result;
int left=0;
int right=0;
for(int i=0;i<s.length();i++)
{
right=max(right,hash[s[i]-'a']);
if(i==right)
{
result.push_back(right-left+1);
left=i+1;
}
}
return 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) {
sort(intervals.begin(),intervals.end(),cmp);
int left=intervals[0][0];
int right=intervals[0][1];
vector<vector<int>>result;
for(int i=1;i<intervals.size();i++)
{
if(intervals[i][0]<=right)
{
right=max(right,intervals[i][1]);
}
if(intervals[i][0]>right)
{
result.push_back({left,right});
left=intervals[i][0];
right=intervals[i][1];
}
}
result.push_back({left,right});
return result;
}
};