代码随想录day36 | 435. 无重叠区间 763. 划分字母区间 56. 合并区间
435. 无重叠区间
思路
重叠区间题目的思路都是一样的,即先对左区间或者右区间进行排序,再去处理每个不重叠区间的边界问题。
- 按照左区间从小到大进行排序
- 当重叠时,更新右边界,结果加一
- 当不重叠时,同时更新左右边界
实现
点击查看代码
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end());
int result = 0;
int end = intervals[0][1];
for(int i = 1; i < intervals.size(); i++) {
if(intervals[i][0] < end) {
result++;
end = min(end, intervals[i][1]);
}
else {
end = intervals[i][1];
}
}
return result;
}
bool static cmp(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
};
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
763. 划分字母区间
思路
这道题本想用回溯来做,复杂度较高。文章中给出的这种做法先统计每个字符的右边界,再去划分字符,可以减小时间复杂度。
- 建立一个26个字符大小hash表,对字符串进行遍历,得出每个字符串的右边界
- 对字符串进行遍历,通过hash表对子串的右边界不断更新,当遍历位置等于子右边界时,表明该子串是最小不重复子串。
实现
点击查看代码
class Solution {
public:
vector<int> partitionLabels(string s) {
int hash[26] = {0};
for(int i = 0; i < s.size(); i++) {
hash[s[i]-'a'] = i;
}
vector<int> result;
int path = 0;
int left = 0;
int right = 0;
for(int i = 0; i < s.size(); i++) {
right = max(right,hash[s[i] - 'a']);
if(i == right) {
path = right - left + 1;
left = right + 1;
result.push_back(path);
}
}
return result;
}
};
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
56. 合并区间
思路
与之前重叠区间相同的思路,不再复述。
实现
点击查看代码
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end());
vector<vector<int>> result;
vector<int> path;
int end = intervals[0][1];
int start = intervals[0][0];
for(int i = 1; i < intervals.size(); i++) {
if(intervals[i][0] <= end) {
end = max(end, intervals[i][1]);
}
else {
path.push_back(start);
path.push_back(end);
result.push_back(path);
path.clear();
start = intervals[i][0];
end = intervals[i][1];
}
}
path.push_back(start);
path.push_back(end);
result.push_back(path);
return result;
}
bool static cmp(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
};
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?