算法Day36 | 435. 无重叠区间,763.划分字母区间,56. 合并区间

Day36

    • 435. 无重叠区间
    • 763.划分字母区间
    • 56. 合并区间

435. 无重叠区间

题目链接:435. 无重叠区间
重复区间的删除是通过std::min()来实现的

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end());
        int res = 0;
        for (int i = 1; i < intervals.size(); ++i) {
            if (intervals[i - 1][1] > intervals[i][0]) {
                ++res;
                intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]);//相当于删除了重复区间
            }
        }
        return res;
    }
};

763.划分字母区间

题目链接:763.划分字母区间
如果包含了a,则要包含所有a,在包含所有a的同时,可能会包含其他字母,其他字母同理。
要先遍历一次,将每个字母出现的最远位置计算出。
设置双指针来计算区间长度。

class Solution {
public:
    vector<int> partitionLabels(string s) {
        vector<int> res;
        int array[26] = {};
        for (int i = 0; i < s.size(); ++i) {
            array[s[i] - 'a'] = i;//记录s[i]字母所出现的最远位置
        }
        int left = 0, right = 0;//通过双指针计算区间长度
        for (int i = 0; i < s.size(); ++i) {
            right = max(array[s[i] - 'a'], right);
            if (i == right) {
                res.push_back(right - left + 1);
                left = i + 1;//更新左区间
            }
        }
        return res;
    }
};

56. 合并区间

题目链接:56. 合并区间
直接将第一个数组放入res中,通过与res.back()比较,直接修改res.back()

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> res;
        sort(intervals.begin(), intervals.end());
        res.push_back(intervals[0]);
        for (int i = 1; i < intervals.size(); ++i) {
            if (res.back()[1] >= intervals[i][0]) {
                res.back()[1] = max(intervals[i][1], res.back()[1]);
            } else {
                res.push_back(intervals[i]);
            }
        }
        return res;
    }
};

你可能感兴趣的:(刷题日志,算法,leetcode,c++)