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;
    }
};
相关推荐
洛水水9 小时前
【力扣100题】33.验证二叉搜索树
算法·leetcode·职场和发展
SimpleLearingAI9 小时前
聚类算法详解
算法·数据挖掘·聚类
刀法如飞10 小时前
Go 字符串查找的 20 种实现方式,用不同思路解决问题
算法·面试·程序员
Dlrb121111 小时前
C语言-指针数组与数组指针
c语言·数据结构·算法·指针·数组指针·指针数组·二级指针
WL_Aurora11 小时前
Python 算法基础篇之集合
python·算法
平行侠12 小时前
A15 工业路由器IP前缀高速检索与内存压缩系统
网络·tcp/ip·算法
阿旭超级学得完13 小时前
C++11包装器(function和bind)
java·开发语言·c++·算法·哈希算法·散列表
li星野13 小时前
位运算 & 数学 & 高频进阶九题通关(Python + C++)
c++·python·学习·算法
jerryinwuhan13 小时前
hello算法,简单讲(1)
算法·排序算法
y = xⁿ13 小时前
20天速通LeetCodeday15:BFS广度优先搜索
算法·宽度优先