1、LeetCode435无重叠区间
题目链接:435无重叠区间
本题和射气球类似,射气球是求不重叠的区间,intervals[i][0] > intervals[i-1][1];
本题求重叠区间,判断 intervals[i][0] < intervals[i-1][1]。
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b)
{
return a[0] < b[0];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if (intervals.size() == 0) return 0;
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])
{
intervals[i][1] = min(intervals[i][1], intervals[i-1][1]);
count++;
}
}
return count;
}
};
2、LeetCode 763划分字母区间
题目链接:763、划分字母区间
首先确定每个字母出现的最远位置。
用哈希表,hash[s[i] - 'a'] = i;
在遍历时,如果碰到比第一个字母最远位置还大的,就更新最远位置,当遍历到最远位置,就是第一个区间,长度为right-left+1。
然后left = i + 1; right是下一个字母的最远位置。
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;
}
int left = 0, right = 0;
vector<int> vec;
for (int i = 0; i < s.size(); i++)
{
right = max(right, hash[s[i] - 'a']);
if (i == right)
{
vec.push_back(right - left + 1);
left = i + 1;
}
}
return vec;
}
};
3、LeetCode56合并区间
题目链接:56、合并区间
合并区间,定义一个新数组,如果有重叠,在新数组上修改右区间
如果不重叠,直接在数组上添加新区间。
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b)
{
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> result;
if (intervals.size() == 0) return result;
sort(intervals.begin(), intervals.end(), cmp);
result.push_back(intervals[0]);
for (int i = 1; i < intervals.size(); i++)
{
if (intervals[i][0] <= result.back()[1])
{
result.back()[1] = max(result.back()[1], intervals[i][1]);
}
else
{
result.push_back(intervals[i]);
}
}
return result;
}
};