目录
Leecode 435.Non-overlapping Intervals
Leecode 435.Non-overlapping Intervals
题目地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目类型:贪心
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end());
// 记录上一个区间的右边界
int right = intervals[0][1], sum = 0;
for (int i = 1; i < intervals.size(); ++i) {
// 出现了重叠,删除右边界最大的那一个
if (intervals[i][0] < right) {
right = min(right, intervals[i][1]);
sum++;
}
// 未重叠,直接更新
else {
right = intervals[i][1];
}
}
return sum;
}
};
Leecode 763.Partition Labels
题目地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目类型:贪心
首先要将所有字母的最后出现位置进行存储,然后再维护每个区间的最右边界(维护方法是不断选取当前区间中字母的最右边界)
class Solution {
public:
vector<int> partitionLabels(string s) {
vector<int> ans;
// 记录最远位置
unordered_map<char, int> ma;
for (int i = 0; i < s.size(); ++i) ma[s[i]] = i;
// right记录当前区间的右边界
int right = 0, sum = 0;
for (int i = 0; i < s.size(); ++i) {
right = max(right, ma[s[i]]);
// 找到了
if (right == i) {
ans.emplace_back(right - sum + 1);
sum = right + 1;
right++;
}
}
return ans;
}
};
Leecode 56.Merge Intervals
题目地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目类型:贪心
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> ans;
sort(intervals.begin(), intervals.end());
// left和right表示当前所维护区间的左右边界
int left = intervals[0][0], right = intervals[0][1];
for (int i = 1; i < intervals.size(); ++i) {
// 存在重叠,更新
if (intervals[i][0] <= right) {
right = max(right, intervals[i][1]);
}
else {
ans.push_back({left, right});
left = intervals[i][0];
right = intervals[i][1];
}
}
ans.push_back({left, right});
return ans;
}
};