代码随想录刷题第36天|LeetCode435无重叠区间、LeetCode 763划分字母区间、LeetCode56合并区间

1、LeetCode435无重叠区间

题目链接:435无重叠区间

本题和射气球类似,射气球是求不重叠的区间,intervals[i][0] > intervals[i-1][1];

本题求重叠区间,判断 intervals[i][0] < intervals[i-1][1]。

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

    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if (intervals.size() == 0) return 0;
        sort(intervals.begin(), intervals.end(), cmp);
        int count = 0;
        for (int i = 1; i < intervals.size(); i++)
        {
            if (intervals[i][0] < intervals[i-1][1])
            {
                intervals[i][1] = min(intervals[i][1], intervals[i-1][1]);
                count++;
            }
        }
        return count;
    }
};

2、LeetCode 763划分字母区间

题目链接:763、划分字母区间

首先确定每个字母出现的最远位置。

用哈希表,hash[s[i] - 'a'] = i;

在遍历时,如果碰到比第一个字母最远位置还大的,就更新最远位置,当遍历到最远位置,就是第一个区间,长度为right-left+1。

然后left = i + 1; right是下一个字母的最远位置。

class Solution {
public:
    vector<int> partitionLabels(string s) {
        int hash[27] = {0};
        for (int i = 0; i < s.size(); i++)
        {
            hash[s[i] - 'a'] = i;
        }

        int left = 0, right = 0;
        vector<int> vec;
        for (int i = 0; i < s.size(); i++)
        {
            right = max(right, hash[s[i] - 'a']);
            if (i == right)
            {
                vec.push_back(right - left + 1);
                left = i + 1;
            }
        }
        return vec;
    }
};

3、LeetCode56合并区间

题目链接:56、合并区间

合并区间,定义一个新数组,如果有重叠,在新数组上修改右区间

如果不重叠,直接在数组上添加新区间。

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

        for (int i = 1; i < intervals.size(); i++)
        {
            if (intervals[i][0] <= result.back()[1])
            {
                result.back()[1] = max(result.back()[1], intervals[i][1]);
            }
            else
            {
                result.push_back(intervals[i]);
            }
        }

        return result;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值