LeetCode 435无重叠区间 763划分字母区间 56合并区间 | 代码随想录25期训练营day36

贪心算法5

LeetCode 435 无重叠区间 2023.11.29

class Solution {
    
    
public:
    //排序按左区间从小到大进行排序,左区间相同时按右区间从小到大排序
    static bool cmp(vector<int>& a, vector<int>& b)
    {
    
    
        if(a[0] == b[0])
            return a[1] < b[1];
        return a[0] < b[0];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
    
    
        //result用于存储最小重叠数组数
        int result = 0;
        //数组排序
        sort(intervals.begin(), intervals.end(), cmp);
        //开始遍历,从索引为1开始比较前一个区间范围
        for (int i = 1; i < intervals.size(); i++)
        {
    
    
            //当前遍历左区间小于上一个区间右区间时
            //重叠数++;且更新右区间为当前与上一个区间较小的右区间!!!
            //因为左区间已经排好序了,所以只需关注右区间选择较小的,这样区间范围最小
            if(intervals[i][0] < intervals[i-1][1])
            {
    
    
                result++;
                intervals[i][1] = min(intervals[i][1], intervals[i-1][1]);
            }
        }
        return result;
    }
};

LeetCode 763 划分字母区间 2023.11.29

vector<int> partitionLabels(string s) {
    
    
    //result存储子字符串数组长度
    vector<int> result;
    //last存储字符串起始位置,用于计算子字符串长度
    //默认为-1,为了保证第一个字符串长度为i+1
    int last = -1;
    //right存储子字符串内元素最远位置
    int right = -1;
    //cur用于避免重复元素重复判断最远位置
    string cur;
    cur.clear();
    //开始搜索
    for (int i = 0; i < s.size(); i++)
    {
    
    
        //如果没有计算过该字符的最远位置则计算并更新子字符串内元素的最远位置,并将字符插入到cur中避免重复元素再次判断
        if(cur.find(s[i]) == cur.npos)
        {
    
    
            right = (int)s.find_last_of(s[i]) > right ? (int)s.find_last_of(s[i]) : right;
            cur.push_back(s[i]);
        }
        //当遍历元素到达最远位置时,记录当前子字符串长度,cur清空,记录下一子字符串起始位置
        if(i == right)
        {
    
    
            result.push_back(i-last);
            cur.clear();
            last = i;
        }
    }
    return result;
}

LeetCode 56 合并区间 2023.11.29

class Solution {
    
    
public:
    //排序按左区间从小到大进行排序,左区间相同时按右区间从小到大排序
    static bool cmp(const vector<int> &a, const vector<int> &b)
    {
    
    
        if(a[0] == b[0])
            return a[1] < b[1];
        return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
    
    
        //result存储为交叠的最大区间数组
        vector<vector<int>> result;
        //先将区间数组从小到大排序
        sort(intervals.begin(), intervals.end(), cmp);
        for (int i = 1; i < intervals.size(); i++)
        {
    
    
            //交叠:当前左区间小于等于上一区间右区间,两区间合并更新在当前区间
            if(intervals[i][0] <= intervals[i-1][1])
            {
    
    
                intervals[i][0] = intervals[i-1][0];
                intervals[i][1] = max(intervals[i-1][1], intervals[i][1]);
            }
            //当前区间与上一区间没交叠,则输出上一区间
            else
                result.push_back(intervals[i-1]);
        }
        //由于最后一个区间没有在遍历中加入到result中,这里加入
        result.push_back(intervals[intervals.size()-1]);
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_66706867/article/details/134688773