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

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

相关推荐
jyan_敬言8 分钟前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio
liulilittle31 分钟前
SNIProxy 轻量级匿名CDN代理架构与实现
开发语言·网络·c++·网关·架构·cdn·通信
张人玉1 小时前
C# 常量与变量
java·算法·c#
学不动CV了1 小时前
数据结构---链表结构体、指针深入理解(三)
c语言·arm开发·数据结构·stm32·单片机·链表
tan77º1 小时前
【Linux网络编程】Socket - UDP
linux·服务器·网络·c++·udp
weixin_446122462 小时前
LinkedList剖析
算法
GiraKoo2 小时前
【GiraKoo】C++14的新特性
c++
悠悠小茉莉2 小时前
Win11 安装 Visual Studio(保姆教程 - 更新至2025.07)
c++·ide·vscode·python·visualstudio·visual studio
坏柠2 小时前
C++ Qt 基础教程:信号与槽机制详解及 QPushButton 实战
c++·qt
泽02022 小时前
C++之红黑树认识与实现
java·c++·rpc