• 代码随想录算法训练营Day36 || leetCode 435. 无重叠区间 || 763.划分字母区间 || 56. 合并区间


    435. 无重叠区间 

    和上一道气球题类似。只不过上一道题中两个区间左右边界相等可视为一个区间,这里不可以。

    1. class Solution {
    2. public:
    3. // 按照区间右边界排序
    4. static bool cmp (const vector<int>& a, const vector<int>& b) {
    5. return a[1] < b[1];
    6. }
    7. int eraseOverlapIntervals(vectorint>>& intervals) {
    8. if (intervals.size() == 0) return 0;
    9. sort(intervals.begin(), intervals.end(), cmp);
    10. int count = 1; // 记录非交叉区间的个数
    11. int end = intervals[0][1]; // 记录区间分割点
    12. for (int i = 1; i < intervals.size(); i++) {
    13. if (end <= intervals[i][0]) {
    14. end = intervals[i][1];
    15. count++;
    16. }
    17. }
    18. return intervals.size() - count;
    19. }
    20. };

    763.划分字母区间 

    统计每一个字符的最远位置,然后利用双指针来确定区间

    1. class Solution {
    2. public:
    3. vector<int> partitionLabels(string S) {
    4. int hash[27] = {0}; // i为字符,hash[i]为字符出现的最后位置
    5. for (int i = 0; i < S.size(); i++) { // 统计每一个字符最后出现的位置
    6. hash[S[i] - 'a'] = i;
    7. }
    8. vector<int> result;
    9. int left = 0;
    10. int right = 0;
    11. for (int i = 0; i < S.size(); i++) {
    12. right = max(right, hash[S[i] - 'a']); // 找到字符出现的最远边界
    13. if (i == right) {
    14. result.push_back(right - left + 1);
    15. left = i + 1;
    16. }
    17. }
    18. return result;
    19. }
    20. };

    56. 合并区间 

    排序,更新右边界,满足题意后加入数组

    1. class Solution {
    2. public:
    3. static bool cmp(const vector<int>& a, const vector<int>& b) {
    4. return a[0] < b[0];
    5. }
    6. vectorint>> merge(vectorint>>& intervals) {
    7. vectorint>> result;
    8. if (intervals.size() == 0) return result; // 区间集合为空直接返回
    9. sort(intervals.begin(), intervals.end(), cmp);
    10. // 第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并
    11. result.push_back(intervals[0]);
    12. for (int i = 1; i < intervals.size(); i++) {
    13. if (result.back()[1] >= intervals[i][0]) { // 发现重叠区间
    14. // 合并区间,只更新右边界就好,因为result.back()的左边界一定是最小值,因为我们按照左边界排序的
    15. result.back()[1] = max(result.back()[1], intervals[i][1]);
    16. } else {
    17. result.push_back(intervals[i]); // 区间不重叠
    18. }
    19. }
    20. return result;
    21. }
    22. };

  • 相关阅读:
    ConcurrentHashMap
    Java.lang.Class类 getGenericSuperclass()方法有什么功能呢?
    redis 事务
    电商平台的支付解决方案
    数电学习(五、触发器)(一)
    DFS 模板:843. n-皇后问题
    算法、语言混编、分布式锁与分布式ID、IO模型
    【校招VIP 前端】电影详情模块的开发文档设计实战
    vue在方法里如何使用过滤器(在methods函数里使用filters)
    C语言入门(五)分支结构
  • 原文地址:https://blog.csdn.net/qq_44884699/article/details/136464164