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

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

相关推荐
colinu4 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
动词ing5 小时前
【题目练习】算法 组合总和||
算法
wuminyu5 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
longlongzihan5 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
专业程序开发源5 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
liulilittle5 小时前
Linux 下 select 测试函数
linux·服务器·网络·数据库·c++·select·c
Logic1015 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
yi0116 小时前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
无忧.芙桃6 小时前
C++语言原理与实践(十二):list类的底层实现
c++·windows·list
沫璃染墨6 小时前
《Linux工程实践篇(二):线程池实战——从线程安全单例到完整源码实现》
linux·开发语言·c++·单例模式·设计模式·系统架构