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

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

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. 划分字母区间
自己写出来的题,虽然之前做过一遍了。
自己的写法虽然比较难看,但是也列出来了。

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;
    }
};

再给一个卡尔的写法

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]来更新右边界,这是一个好方法。

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;
    }
};

最近更新

  1. TCP协议是安全的吗?

    2024-02-20 14:44:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-20 14:44:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-20 14:44:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-20 14:44:03       20 阅读

热门阅读

  1. 【算法 - 动态规划】力扣 691. 贴纸拼词

    2024-02-20 14:44:03       31 阅读
  2. typescript type 类型别名详解

    2024-02-20 14:44:03       31 阅读
  3. macad3d解析macad—application,commands,utils

    2024-02-20 14:44:03       27 阅读
  4. unity中UI、shader显示在3D物体前

    2024-02-20 14:44:03       28 阅读
  5. LeetCode 93. 复原 IP 地址

    2024-02-20 14:44:03       28 阅读
  6. yum方式快速安装mysql

    2024-02-20 14:44:03       29 阅读
  7. 动态规划之编辑距离(接上一个题)

    2024-02-20 14:44:03       37 阅读
  8. 物联网芯片ESP8266 介绍

    2024-02-20 14:44:03       29 阅读
  9. React setState同步还是异步

    2024-02-20 14:44:03       33 阅读