提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、435无重叠区间
画出图来就清楚了,前后两个区间的位置分成四种情况讨论。
class Solution {
public:
static bool cmp(vector<int>& a, vector<int>& b) {
if (a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);
int left = intervals[0][0];
int right = intervals[0][1];
int res = 0;
for (int i = 1; i < intervals.size(); i ++) {
if (intervals[i][0] == left) {
res ++;
}
else if (intervals[i][0] < right) {
if (intervals[i][1] < right) {
left = intervals[i][0];
right = intervals[i][1];
}
res ++;
}
else {
left = intervals[i][0];
right = intervals[i][1];
}
}
return res;
}
};
优化版(重叠区间普遍思路):
class Solution {
public:
static bool cmp(vector<int>& a, vector<int>& b) {
if (a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);
int res = 0;
for (int i = 1; i < intervals.size(); i ++) {
if (intervals[i][0] < intervals[i-1][1]) {
res ++;
intervals[i][1] = min(intervals[i][1], intervals[i-1][1]);
}
}
return res;
}
};
二、763划分字母区间
先找到每个字母最后一次出现的下标,存到vector中;然后遍历字符串,通过set判断字符是否第一次出现,若第一次出现,在vector中找到最后一次的下表,存在二维数组中;对二维数组排序,问题转换为有序二维数组合并重叠区间。
class Solution {
public:
vector<int> partitionLabels(string s) {
vector<vector<int>> vec;
vector<int> map(30);
vector<int> res;
for (int i = 0; i < s.size(); i ++) {
map[s[i]-'a'] = i;
}
for (int i = 0; i < s.size(); i ++) {
if (map[s[i]-'a'] != -1) {
vec.push_back({i, map[s[i]-'a']});
map[s[i]-'a'] = -1;
}
}
sort(vec.begin(), vec.end());
for (int i = 1; i < vec.size(); i ++) {
if (vec[i][0] >= vec[i-1][1]) {
res.push_back(vec[i-1][1] - vec[i-1][0] + 1);
}
else {
vec[i][0] = vec[i-1][0];
vec[i][1] = max(vec[i-1][1], vec[i][1]);
}
}
res.push_back(vec.back()[1] - vec.back()[0] + 1);
return res;
}
};
优化版:
class Solution {
public:
vector<int> partitionLabels(string s) {
vector<int> map(30);
vector<int> res;
for (int i = 0; i < s.size(); i ++) {
map[s[i]-'a'] = i;
}
int maxNum = map[s[0]-'a'];
int index = 0;
for (int i = 0; i < s.size(); i ++) {
maxNum = max(maxNum, map[s[i]-'a']);
if (i == maxNum) {
res.push_back(i - index + 1);
index = i + 1;
}
}
return res;
}
};
三、56合并区间
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end());
vector<vector<int>> res;
int start = intervals[0][0];
int end = intervals[0][1];
for (int i = 1; i < intervals.size(); i ++) {
if (intervals[i][0] <= end) {
end = max(end, intervals[i][1]);
}
else {
res.push_back({start, end});
start = intervals[i][0];
end = intervals[i][1];
}
}
res.push_back({start, end});
return res;
}
};
优化版:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end());
vector<vector<int>> res;
res.push_back(intervals[0]);
for (int i = 1; i < intervals.size(); i ++) {
if (intervals[i][0] <= res.back()[1]) {
res.back()[1] = max(res.back()[1], intervals[i][1]);
}
else {
res.push_back(intervals[i]);
}
}
return res;
}
};