状态:Debug后AC。
和昨天的射箭问题一样,区别就是res的初始状态一个是1一个是0。时间复杂度,空间复杂度
,代码如下:
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) {
int len = intervals.size();
int res = 0;
if(len == 1) return res;
sort(intervals.begin(), intervals.end(), cmp);
for(int i = 1; i < len; ++i){
if(intervals[i][0] < intervals[i-1][1]){
//重叠,去除范围较大的那一个,所以要将右边界变为较小的
intervals[i][1] = min(intervals[i][1], intervals[i-1][1]);
res++;
}
}
return res;
}
};
状态:AC。
首先需要对各个字母的首次/最后出现时间进行统计,之后就是合并区间问题。时间复杂度,空间复杂度
,代码如下:
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b){
return a[0] < b[0];
}
vector<int> partitionLabels(string s) {
// 先统计各个字母出现的起始,终止索引点
// 用一个二维数组作为哈希表
vector<vector<int>> record(26, vector<int>(2, -1));
int len = s.size();
if(len == 1) return {1};
for(int i = 0; i < len; ++i){
int alph = (s[i]-'a')+0;
// 更新第一次遇见的下标
if(record[alph][0] == -1){
record[alph][0] = i;
}
// 更新最右的下标
record[alph][1] = i;
}
vector<vector<int>> intervals;
for(auto n : record){
if(n[0] != -1){
intervals.emplace_back(n);
}
}
sort(intervals.begin(), intervals.end(), cmp);
int len_i = intervals.size();
vector<int> res;
for(int i = 1; i < len_i; ++i){
// 找出重叠区域
if(intervals[i][0] < intervals[i-1][1]){
// 重叠,将区间变为并集
intervals[i][0] = intervals[i-1][0];
intervals[i][1] = max(intervals[i][1], intervals[i-1][1]);
}else{
// 不重叠,将上一个区间的长度存储为答案
res.emplace_back(intervals[i-1][1] - intervals[i-1][0] + 1);
}
}
res.emplace_back(intervals[len_i-1][1] - intervals[len_i-1][0] + 1);
return res;
}
};
状态:Debug后AC。
同样是确定一个维度(排序),然后和射箭/无重叠区间类似。注意要在遍历结束后把最后一个插入进去。时间复杂度,空间复杂度
,代码如下:
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) {
int len = intervals.size();
if(len == 1) return intervals;
vector<vector<int>> res; // 因为插入操作多,所以先用list构建
sort(intervals.begin(), intervals.end(), cmp);
for(int i = 1; i < len; ++i){
if(intervals[i][0] <= intervals[i-1][1]){
intervals[i][0] = intervals[i-1][0];
intervals[i][1] = max(intervals[i][1], intervals[i-1][1]);
}else{
res.emplace_back(intervals[i-1]);
}
}
res.emplace_back(intervals[len-1]);
return res;
}
};