代码随想录算法训练营第三十六天|435. 无重叠区间、763.划分字母区间、56.合并区间

贪心

文章目录


一、无重叠区间

求移除重叠区间,等于所有区间减去重叠区间,也就是重叠空间个数

cpp 复制代码
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.再次遍历,如果当前遍历的下标等于该字母的最大下标,即划分

cpp 复制代码
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;
    }
};

三、合并区间

同前几题,都是判断重叠区间,与之不同的是此题要求合并重叠区间
判断是否与前一区间重叠,如果重叠则取最大值右边界,加入到结果集中,否则直接加入

cpp 复制代码
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。

学习资料:《代码随想录》

相关推荐
Shaun_青璇14 分钟前
Cpp 知识3
开发语言·c++·算法
景彡先生32 分钟前
C++中的RAII技术:资源获取即初始化
开发语言·c++
小鸡脚来咯1 小时前
ThreadLocal实现原理
java·开发语言·算法
编程绿豆侠1 小时前
力扣HOT100之技巧:75. 颜色分类
算法·leetcode·排序算法
程序员Xu1 小时前
大厂机试题解法笔记大纲+按知识点分类+算法编码训练
笔记·算法
achene_ql1 小时前
手写muduo网络库(七):深入剖析 Acceptor 类
linux·服务器·开发语言·网络·c++
礼貌而已1 小时前
Vue3项目与桌面端(C++)通过Websocket 对接接口方案实现
开发语言·c++·websocket
DarkChunk2 小时前
[BUG]Cursor C++扩展不支持
算法
Lenyiin2 小时前
第 87 场周赛:比较含退格的字符串、数组中的最长山脉、一手顺子、访问所有节点的最短路径
java·c++·python·leetcode·周赛·lenyiin
怀旧,2 小时前
【数据结构】7. 栈和队列
数据结构