435. 无重叠区间(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:重叠区间的经典题,和昨天最后一题类似,找到重叠在一块儿的(必须每个区间的交集存在不为空),计算整个数组有多少堆这样重叠在一块儿的,就说明经过移除,最多可以剩下多少互不重叠的区间。可以先将数组按照endi排序,也可以将数组按starti排序。
static bool cmp(const vector<int>& a, const vector<int>& b){
return a[1] < b[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);
int result = 1;
int size = intervals.size();
for(int i=1; i<size; i++){
if(intervals[i-1][1] <= intervals[i][0]){
result++;
}else{
intervals[i][1] = intervals[i-1][1];
}
}
return size-result;
}
static bool cmp(const vector<int>& a, const vector<int>& b){
return a[0] < b[0];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);
int result = 1;
int size = intervals.size();
for(int i=1; i<size; i++){
if(intervals[i-1][1] > intervals[i][0]){
intervals[i][1] = min(intervals[i-1][1], intervals[i][1]);
}else{
result++;
}
}
return size-result;
}
763. 划分字母区间(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:可以不不构造正规的放starti和endi的数组,只需记录每个字母最后出现的位置,相当于endi,这样可以不用构造二维数组,一维数组数组就够了。
vector<int> partitionLabels(string s) {
int hash[27] = {0};
int size = s.size();
for(int i=0; i<size; i++){
hash[s[i]-'a'] = i;
}
vector<int> result;
int left = 0;
int right = 0;
for(int i=0; i<size; i++){
right = max(right, hash[s[i]-'a']);
if(right == i){
result.push_back(right-left+1);
left = i+1;
}
}
return result;
}
56. 合并区间(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:可以总结发现这种计算重叠区间的题目,完全都是一个套路,先将区间按照starti或者endi排序,然后遍历一遍,过程中计算是否重叠。
static bool cmp(const vector<int>& a, const vector<int>& b){
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
int size = intervals.size();
if(size == 1) return intervals;
sort(intervals.begin(), intervals.end(), cmp);
vector<vector<int>> result;
for(int i=1; i<size; i++){
if(intervals[i-1][1] < intervals[i][0]){
result.push_back(intervals[i-1]);
}else{
intervals[i][0] = intervals[i-1][0];
intervals[i][1] = max(intervals[i-1][1], intervals[i][1]);
}
}
result.push_back(intervals[size-1]);
return result;
}