代码随想录算法训练营第三十六天|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。

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

相关推荐
漫随流水8 分钟前
leetcode算法(145.二叉树的后序遍历)
数据结构·算法·leetcode·二叉树
Tony_yitao14 分钟前
22.华为OD机试真题:数组拼接(Java实现,100分通关)
java·算法·华为od·algorithm
2501_9418752816 分钟前
在东京复杂分布式系统中构建统一可观测性平台的工程设计实践与演进经验总结
c++·算法·github
sonadorje18 分钟前
梯度下降法的迭代步骤
算法·机器学习
漫随流水21 分钟前
leetcode算法(94.二叉树的中序遍历)
数据结构·算法·leetcode·二叉树
Jacen.L27 分钟前
SIGABRT (6) 中止信号详解
c++
王老师青少年编程1 小时前
信奥赛C++提高组csp-s之并查集(案例实践)2
数据结构·c++·并查集·csp·信奥赛·csp-s·提高组
范纹杉想快点毕业1 小时前
嵌入式通信核心架构:从状态机、环形队列到多协议融合
linux·运维·c语言·算法·设计模式
智源研究院官方账号1 小时前
众智FlagOS 1.6发布,以统一架构推动AI硬件、软件技术生态创新发展
数据库·人工智能·算法·架构·编辑器·硬件工程·开源软件