代码随想录训练营day38|435. 无重叠区间、763.划分字母区间

435. 无重叠区间 (中等

leetcode题目链接:435. 无重叠区间 - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,依然是判断重叠区间 | LeetCode:435.无重叠区间_哔哩哔哩_bilibili

题目描述

代码随想录训练营day38|435. 无重叠区间、763.划分字母区间_第1张图片

 解题思路

本题和昨天的气球题差不多,但要稍微变换一下思路。

例如:

[[1,2],[1,3],[2,3],[3,4]]

当我们按左区间排好序后,判断是否有重复,[1,2]和[1,3]有重复,那我们就可以删除区间[1,3],但此时我们要更新[1,3]的右区间,变为较小的那个,这样在下一个判断时就不会重复了。

题目代码

class Solution {
public:
    static bool cmp(const vector& a, const vector& b)
    {
        return a[0] < b[0];
    }
    int eraseOverlapIntervals(vector>& intervals)
    {
        int result = 0;
        sort(intervals.begin(), intervals.end(),cmp);
        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;
    }
};

763.划分字母区间(中等

leetcode题目链接:763. 划分字母区间 - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,寻找最远的出现位置! LeetCode:763.划分字母区间_哔哩哔哩_bilibili

题目描述

代码随想录训练营day38|435. 无重叠区间、763.划分字母区间_第2张图片

解题思路 

代码随想录训练营day38|435. 无重叠区间、763.划分字母区间_第3张图片

如图,我们首先记录每个字母出现的最远位置。

然后在遍历时,记录一个max_pos,一个start。我们从下标0开始,是'a',max_pos = 8,下标1,'b',5<8,故max_pos = 8,下标4 'c' 7<8 max_pos = 8。当i遍历到max_size后,记录区间长度max_pos - start,更新start = max_pos,继续遍历即可。

题目代码

class Solution {
public:
    vector partitionLabels(string s)
    {
        int set[26];
        vectorresult;
        for (int i = 0; i < s.size(); i++)
            set[s[i] - 'a'] = i;
        int max_pos = 0;
        int start = -1;
        for (int i = 0; i < s.size(); i++)
        {
            if (set[s[i] - 'a'] > max_pos)
                max_pos = set[s[i] - 'a'];
            if (i == max_pos)
            {
                result.push_back(max_pos - start);
                start = max_pos;
            }
        }
        return result;
    }
};

56. 合并区间(中等

leetcode题目链接:56. 合并区间 - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,合并区间有细节!LeetCode:56.合并区间_哔哩哔哩_bilibili

题目描述

代码随想录训练营day38|435. 无重叠区间、763.划分字母区间_第4张图片

解题思路

有重叠就改变区间,没重叠就直接push_back

题目代码

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

 

你可能感兴趣的:(算法)