LeetCode 36天 | 435.无重叠区域 763.划分字母区间 56.合并区间

435. 无重叠区间
左边排序,右边裁剪为当前最小的

cpp 复制代码
class Solution {
public:
    // 按照左边界排序
    static bool cmp(vector<int> a, vector<int> b) {
        return a[0] < b[0];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        int res = 0;
        sort(intervals.begin(), intervals.end(), cmp);
        // i从1开始计数
        for (int i = 1; i<intervals.size(); i++) {
            // 仅当与上一条产生重叠时处理
            if (intervals[i][0] < intervals[i-1][1]) {
                res++;
                // 重叠时右边界统一切为最小值
                intervals[i][1] = min(intervals[i][1], intervals[i-1][1]);
            }
        }
        return res;
    }
};

763. 划分字母区间
自己写出来的题,虽然之前做过一遍了。
自己的写法虽然比较难看,但是也列出来了。

cpp 复制代码
class Solution {
public:
    // 第二遍做,自己写出来的,耶耶耶
    vector<int> partitionLabels(string s) {
        unordered_map<char,int> umap;
        // 打印每个字符出现的最远记录
        for (int i = 0; i<s.size(); i++) {
            umap[s[i]] = i;
        }
        // 打印输出查看map记录
        for (auto [key,value]:umap){
            cout<<key<<" "<<value<<endl;
        }
        vector<int> res;
        // 当前字符串的最远角标
        int last = 0;
        // 当前字符串的起始角标
        int lastIndex = 0;
        for (int i = 0; i < s.size(); i++) {
            if (umap[s[i]] == i && last == i){
                res.push_back(i-lastIndex+1);
                lastIndex = i+1;
                last = i+1;
            }
            else {
                last = max(last, umap[s[i]]);
            }
        }
        return res;
    }
};

再给一个卡尔的写法

cpp 复制代码
class Solution {
public:
    vector<int> partitionLabels(string S) {
        int hash[27] = {0}; // i为字符,hash[i]为字符出现的最后位置
        for (int i = 0; i < S.size(); i++) { // 统计每一个字符最后出现的位置
            hash[S[i] - 'a'] = i;
        }
        vector<int> result;
        int left = 0;
        int right = 0;
        for (int i = 0; i < S.size(); i++) {
            right = max(right, hash[S[i] - 'a']); // 找到字符出现的最远边界
            if (i == right) {
                result.push_back(right - left + 1);
                left = i + 1;
            }
        }
        return result;
    }
};

56. 合并区间

重叠区域的题目大都要按左边界先排序。学了个lambda表达式。可以直接将一个区域放入结果集用res.back()[1]来更新右边界,这是一个好方法。

cpp 复制代码
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> res;
        if (intervals.size() == 0) return res;
        // 按左边界排序,lambda表达式
        sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0]<b[0];});
        res.push_back(intervals[0]);
        for (int i = 1; i<intervals.size(); i++) {
            // 如果左边界小于等于加入的尾部的右边界,更新尾部的右边界
            if (intervals[i][0] <= res.back()[1]) {
                res.back()[1] = max(res.back()[1],intervals[i][1]);
            }
            else {
                // 直接将下一段加入结果集
                res.push_back(intervals[i]);
            }
        }
        return res;
    }
};
相关推荐
南境十里·墨染春水5 小时前
C++传记(面向对象)虚析构函数 纯虚函数 抽象类 final、override关键字
开发语言·c++·笔记·算法
2301_797172755 小时前
基于C++的游戏引擎开发
开发语言·c++·算法
有为少年6 小时前
告别“唯语料论”:用合成抽象数据为大模型开智
人工智能·深度学习·神经网络·算法·机器学习·大模型·预训练
比昨天多敲两行6 小时前
C++ 二叉搜索树
开发语言·c++·算法
Season4506 小时前
C++11之正则表达式使用指南--[正则表达式介绍]|[regex的常用函数等介绍]
c++·算法·正则表达式
Tisfy6 小时前
LeetCode 2839.判断通过操作能否让字符串相等 I:if-else(两两判断)
算法·leetcode·字符串·题解
问好眼6 小时前
《算法竞赛进阶指南》0x04 二分-1.最佳牛围栏
数据结构·c++·算法·二分·信息学奥赛
会编程的土豆7 小时前
【数据结构与算法】优先队列
数据结构·算法
minji...8 小时前
Linux 进程信号(二)信号的保存,sigset_t,sigprocmask,sigpending
linux·运维·服务器·网络·数据结构·c++·算法
罗湖老棍子9 小时前
最大数(信息学奥赛一本通- P1549)(洛谷-P1198)
数据结构·算法·线段树·单点修改 区间求最大值