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;
    }
};
相关推荐
沐怡旸4 小时前
【算法】【链表】328.奇偶链表--通俗讲解
算法·面试
掘金安东尼7 小时前
Amazon Lambda + API Gateway 实战,无服务器架构入门
算法·架构
码流之上8 小时前
【一看就会一写就废 指间算法】设计电子表格 —— 哈希表、字符串处理
javascript·算法
快手技术10 小时前
快手提出端到端生成式搜索框架 OneSearch,让搜索“一步到位”!
算法
CoovallyAIHub1 天前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
NAGNIP1 天前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo1 天前
半开区间和开区间的两个二分模版
算法
moonlifesudo1 天前
300:最长递增子序列
算法
CoovallyAIHub1 天前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉