本文主要是介绍代码随想录算法训练营第三十六天|435. 无重叠区间、763.划分字母区间、56.合并区间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
贪心
文章目录
- 一、无重叠区间
- 二、划分字母区间
- 三、合并区间
- 总结
一、无重叠区间
求移除重叠区间,等于所有区间减去重叠区间,也就是重叠空间个数
class Solution {
public:static bool cmp (vector<int>& a, vector<int>& b) {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], intervals[i-1][1]);}}return count;}
};
二、划分字母区间
同一个字母只能出现在一个区间内,所以可以根据当前字母出现的最大下标作为区间结尾
1.遍历求出每个字母的最大出现下标
2.再次遍历,如果当前遍历的下标等于该字母的最大下标,即划分
class Solution {
public:vector<int> partitionLabels(string s) {int right = 0;int left = 0;int nums[27] = {0};for (int i = 0; i < s.size(); i++) { // 统计每一个字符最后出现的位置nums[s[i] - 'a'] = i;}vector<int>result;for (int i = 0; i < s.size(); i++) {right = max(right, nums[s[i] - 'a']);if (i == right) {result.push_back(right - left + 1);left = i + 1;}}return result;}
};
三、合并区间
同前几题,都是判断重叠区间,与之不同的是此题要求合并重叠区间
判断是否与前一区间重叠,如果重叠则取最大值右边界,加入到结果集中,否则直接加入
class Solution {
public:static bool cmp (vector<int>& a, 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>>result;result.push_back(intervals[0]);for (int i = 1; i < intervals.size(); i++) {if (result.back()[1] >= intervals[i][0]) {result.back()[1] = max(result.back()[1], intervals[i][1]);}else result.push_back(intervals[i]);}return result;}
};
总结
前几天一直在忙导师项目,太累了,慢慢补吧,加油!
学习时间90min。
学习资料:《代码随想录》。
这篇关于代码随想录算法训练营第三十六天|435. 无重叠区间、763.划分字母区间、56.合并区间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!