代码随想录day36 | 435. 无重叠区间 763. 划分字母区间 56. 合并区间

435. 无重叠区间

题目|文章
image

思路

重叠区间题目的思路都是一样的,即先对左区间或者右区间进行排序,再去处理每个不重叠区间的边界问题。

  1. 按照左区间从小到大进行排序
  2. 当重叠时,更新右边界,结果加一
  3. 当不重叠时,同时更新左右边界

实现

点击查看代码
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end());
        int result = 0;
        int end = intervals[0][1];
        for(int i = 1; i < intervals.size(); i++) {
            if(intervals[i][0] < end) {
                result++;
                end = min(end, intervals[i][1]);
            }
            else {
                end = intervals[i][1];
            }

        }
        return result;
    }
    bool static cmp(const vector<int>& a, const vector<int>& b) {
        return a[0] < b[0];
    }
};

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

763. 划分字母区间

题目|文章
image

思路

这道题本想用回溯来做,复杂度较高。文章中给出的这种做法先统计每个字符的右边界,再去划分字符,可以减小时间复杂度。

  1. 建立一个26个字符大小hash表,对字符串进行遍历,得出每个字符串的右边界
  2. 对字符串进行遍历,通过hash表对子串的右边界不断更新,当遍历位置等于子右边界时,表明该子串是最小不重复子串。

实现

点击查看代码
class Solution {
public:
    vector<int> partitionLabels(string s) {
        int hash[26] = {0};
        for(int i = 0; i < s.size(); i++) {
            hash[s[i]-'a'] = i;
        }
        vector<int> result;
        int path = 0;
        int left = 0;
        int right = 0;
        for(int i = 0; i < s.size(); i++) {
            right = max(right,hash[s[i] - 'a']);
            if(i == right) {
                path = right - left + 1;
                left = right + 1; 
                result.push_back(path); 
            }
        }
        return result;
        
    }
};

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

56. 合并区间

题目|文章
image

思路

与之前重叠区间相同的思路,不再复述。

实现

点击查看代码
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end());
        vector<vector<int>> result;
        vector<int> path;
        int end = intervals[0][1];
        int start = intervals[0][0];
        for(int i = 1; i < intervals.size(); i++) {
            if(intervals[i][0] <= end) {
                end = max(end, intervals[i][1]);
            }
            else {
                path.push_back(start);
                path.push_back(end);
                result.push_back(path);
                path.clear();
                start = intervals[i][0];
                end = intervals[i][1];
            }
        }
        path.push_back(start);
                path.push_back(end);
                result.push_back(path);
        return result;
    }
    bool static cmp(const vector<int>& a, const vector<int>& b) {
        return a[0] < b[0];
    }
};

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
posted @   缩地  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示