LeetCode 435无重叠区间
题目链接:435.无重叠区间
class Solution {
public:
//按区间左边界排序
bool static cmp(const vector<int>& a, const 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 count = 0;
for (int i = 1; i < intervals.size(); ++i) {
if (intervals[i][0] < intervals[i - 1][1]) {
++count;
intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]);//相当于留下右边界更小的区间
}
}
return count;
}
};
LeetCode 763划分字母区间
题目链接:763.划分字母区间
class Solution {
public:
bool static cmp(const vector<int>& a, const vector<int>& b) {
if (a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
vector<int> partitionLabels(string s) {
//用二维数组存放每个字母开始-结束位置,划分区间,看无重叠自区间个数以及大小
vector<vector<int>> num(26, vector<int>(2, -1));
for (int i = 0; i < s.size(); ++i) {
int index = s[i] - 'a';
if (num[index][0] == -1) {
num[index][0] = i;
num[index][1] = i;
}
else num[index][1] = i;
}
vector<int> ans;
sort(num.begin(), num.end(), cmp);
int start = 0;
for (int i = 0; i < num.size() - 1; ++i) {
if (num[i][0] != -1) {
if (num[i + 1][0] > num[i][1]) {
ans.push_back(num[i][1] - start + 1);
start = num[i + 1][0];
}
if (num[i + 1][0] < num[i][1]) {
num[i + 1][1] = max(num[i][1], num[i + 1][1]);
}
}
}
ans.push_back(s.size() - start);//最后一个子字符串长度
return ans;
}
};
- 上面的方法较麻烦
- 仅需统计每个字符最后出现的位置
- 从头遍历,并更新当前遍历的子字符串的最远下标,如果找到最远下标和当前下标相等,则找到分割点
class Solution {
public:
vector<int> partitionLabels(string s) {
int hash[27] = { 0 };
for (int i = 0; i < s.size(); ++i) {
hash[s[i] - 'a'] = i;
}
vector<int> ans;
int start = 0, end = 0;
for (int i = 0; i < s.size(); ++i) {
//找到当前遍历的字符串出现的最远边界
end = max(end, hash[s[i] - 'a']);//更新!!!
if (i == end) {//这里不能与hash[s[i] - 'a']比较
ans.push_back(end - start + 1);
start = i + 1;
}
}
return ans;
}
};
LeetCode 56合并区间
题目链接:56.合并区间
class Solution {
public:
bool static cmp(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);
vector<vector<int>> ans;
int start = intervals[0][0], end = intervals[0][1];
for (int i = 1; i < intervals.size(); ++i) {
if (intervals[i][0] <= end) {
end = max(intervals[i][1], end);
}
else {
ans.push_back(vector<int>{ start, end });
start = intervals[i][0];
end = intervals[i][1];
}
}
ans.push_back(vector<int>{start, end});
return ans;
}
};